Tengo una colección MongoDB con documentos en el siguiente formato:
{
"_id" : ObjectId("4e8ae86d08101908e1000001"),
"name" : ["Name"],
"zipcode" : ["2223"]
}
{
"_id" : ObjectId("4e8ae86d08101908e1000002"),
"name" : ["Another ", "Name"],
"zipcode" : ["2224"]
}
Actualmente puedo obtener documentos que coinciden con un tamaño de matriz específico:
db.accommodations.find({ name : { $size : 2 }})
Esto devuelve correctamente los documentos con 2 elementos en la name
matriz. Sin embargo, no puedo hacer un $gt
comando para devolver todos los documentos donde el name
campo tiene un tamaño de matriz mayor que 2:
db.accommodations.find({ name : { $size: { $gt : 1 } }})
¿Cómo puedo seleccionar todos los documentos con una name
matriz de un tamaño mayor que uno (preferiblemente sin tener que modificar la estructura de datos actual)?
mongodb
mongodb-query
emson
fuente
fuente
Respuestas:
Actualizar:
Para las versiones mongodb 2.2+ forma más eficiente de hacer esto descrito por @JohnnyHK en otra respuesta .
1.Utilizando $ where
Pero...
2.Cree un campo adicional
NamesArrayLength
, actualícelo con la longitud de la matriz de nombres y luego utilícelo en consultas:Será una mejor solución y funcionará mucho más rápido (puede crear un índice en él).
fuente
$where
, es muy flexible.Hay una manera más eficiente de hacer esto en MongoDB 2.2+ ahora que puede usar índices de matriz numérica en las claves de objeto de consulta.
Puede admitir esta consulta con un índice que use una expresión de filtro parcial (requiere 3.2+):
fuente
{'Name Field.1': {$exists: true}}
.name
contiene al menos 1 elemento, pero el OP estaba buscando más de 1.Creo que esta es la consulta más rápida que responde a su pregunta, porque no utiliza una
$where
cláusula interpretada :Significa "todos los documentos excepto aquellos sin un nombre (ya sea una matriz inexistente o vacía) o con un solo nombre".
Prueba:
fuente
{'name.1': {$exists: true}}
'name.1': {$exists: true}}
, y también porque está codificada para "1" y no escala a una longitud mínima de matriz arbitraria o paramétrica.También puedes usar agregado:
// agrega "size_of_name" al documento de tránsito y lo usa para filtrar el tamaño del nombre
fuente
Intenta hacer algo como esto:
1 es el número, si desea obtener un registro superior a 50, haga ArrayName.50 Gracias.
fuente
Nada de lo anterior funcionó para mí. Este lo hizo, así que lo estoy compartiendo:
fuente
Puede usar $ expr (operador de versión 3.6 mongo) para usar funciones de agregación en consultas regulares.
Comparar
query operators
vsaggregation comparison operators
.fuente
$name
una matriz que es un subdocumento, por ejemplo, en un registro de "persona"passport.stamps
? Intenté varias combinaciones de citas pero me sale"The argument to $size must be an array, but was of type: string/missing"
.db.col.find({$expr:{$gt:[{$size:{$ifNull:["$passport.stamps", []]}}, 1]}})
fuente
MongoDB 3.6 incluye $ expr https://docs.mongodb.com/manual/reference/operator/query/expr/
Puede usar $ expr para evaluar una expresión dentro de $ match, o encontrar.
o encontrar
fuente
Encontré esta solución, para encontrar elementos con un campo de matriz mayor que cierta longitud
El primer agregado de $ match usa un argumento que es verdadero para todos los documentos. Si estuviera en blanco, obtendría
fuente
Sé su vieja pregunta, pero estoy intentando esto con $ gte y $ size en find. Creo que find () es más rápido.
fuente
Aunque lo anterior responde a todo el trabajo, lo que trató originalmente de hacer fue la forma correcta, sin embargo, solo tiene la sintaxis hacia atrás (cambie "$ size" y "$ gt").
Correcto:
Incorrecto:
fuente