than len greater array mongodb mongodb-query

mongodb - len - Consulta de documentos donde el tamaño de la matriz es mayor que 1



mongodb array size greater than (10)

Aunque lo anterior responde a todo el trabajo, lo que originalmente intentaste hacer fue de la manera correcta, sin embargo, solo tienes la sintaxis al revés (cambia "$ size" y "$ gt") ..

Correcto:

db.collection.find({items: {$gt: {$size: 1}}})

Incorrecto:

db.collection.find({items: {$size: {$gt: 1}}})

Tengo una colección de 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 matriz de name . Sin embargo, no puedo $gt comando $gt para devolver todos los documentos donde el campo de name 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 matriz de name de un tamaño mayor que uno (preferiblemente sin tener que modificar la estructura de datos actual)?


Creo que esta es la consulta más rápida que responde a su pregunta, porque no usa una cláusula $where interpreta:

{$nor: [ {name: {$exists: false}}, {name: {$size: 0}}, {name: {$size: 1}} ]}

Significa "todos los documentos excepto aquellos sin nombre (ya sea no existente o matriz vacía) o con un solo nombre".

Prueba:

> db.test.save({}) > db.test.save({name: []}) > db.test.save({name: [''George'']}) > db.test.save({name: [''George'', ''Raymond'']}) > db.test.save({name: [''George'', ''Raymond'', ''Richard'']}) > db.test.save({name: [''George'', ''Raymond'', ''Richard'', ''Martin'']}) > db.test.find({$nor: [{name: {$exists: false}}, {name: {$size: 0}}, {name: {$size: 1}}]}) { "_id" : ObjectId("511907e3fb13145a3d2e225b"), "name" : [ "George", "Raymond" ] } { "_id" : ObjectId("511907e3fb13145a3d2e225c"), "name" : [ "George", "Raymond", "Richard" ] } { "_id" : ObjectId("511907e3fb13145a3d2e225d"), "name" : [ "George", "Raymond", "Richard", "Martin" ] } >


Encontré esta solución, para encontrar elementos con un campo de matriz mayor que cierta longitud

"errmsg" : "exception: The argument to $size must be an Array, but was of type: EOO"

El primer agregado de $ match usa un argumento que es verdadero para todos los documentos. Si está en blanco, obtendría

db.accommodations.find({$expr:{$gt:[{$size:"$name"}, 1]}})


Hay una forma más eficiente de hacer esto en MongoDB 2.2+ ahora que puede usar índices de matrices numéricas en claves de objetos de consulta.

// Find all docs that have at least a second name array element. db.accommodations.find({''name.1'': {$exists: true}})


Intenta hacer algo como esto:

db.getCollection(''collectionName'').find({''ArrayName.1'': {$exists: true}})

1 es el número, si desea obtener un registro superior a 50, haga ArrayName.50 Gracias.


Nada de lo anterior funcionó para mí. Éste lo hizo así que lo comparto:

db.collection.find( {arrayName : {$exists:true}, $where:''this.arrayName.length>1''} )


Puede usar $expr (operador de la versión 3.6 mongo) para usar las funciones de agregación en una consulta regular.

Comparar query operators frente a aggregation comparison operators .

db.allusers.aggregate([ {$match:{username:{$exists:true}}}, {$project: { count: { $size:"$locations.lat" }}}, {$match:{count:{$gt:20}}} ])


También puedes utilizar el agregado:

db.accommodations.aggregate( [ {$project: {_id:1, name:1, zipcode:1, size_of_name: {$size: "$name"} } }, {$match: {"size_of_name": {$gt: 1}}} ])

// agrega "size_of_name" al documento de tránsito y lo usa para filtrar el tamaño del nombre


Actualizar:

Para las versiones mongodb 2.2+, hay una forma más eficiente de hacerlo descrita por @JohnnyHK en otra answer .

1.Utilizando $where

db.accommodations.find( { $where: "this.name.length > 1" } );

Pero...

Javascript se ejecuta más lentamente que los operadores nativos enumerados en esta página, pero es muy flexible. Consulte la página de procesamiento del lado del servidor para obtener más información.

2.Cree el campo adicional NamesArrayLength , actualícelo con la longitud de la matriz de nombres y luego utilícelo en las consultas:

db.accommodations.find({"NamesArrayLength": {$gt: 1} });

Será una mejor solución y funcionará mucho más rápido (puede crear un índice en ella).


db.accommodations.find({"name":{"$exists":true, "$ne":[], "$not":{"$size":1}}})