Consultar tamaño de matriz interna en MongoDB

Considere un documento MongoDB en la colección de users :

 { username : 'Alex', tags: ['C#', 'Java', 'C++'] } 

¿Hay alguna manera de obtener la longitud de la matriz de tags desde el lado del servidor (sin pasar las tags al cliente)?

¡Gracias!

Ahora MongoDB (versión 2.6) es compatible con la operación de $size en la agregación.

De la documentación:

 { : { $size:  } } 

Lo que desea puede lograrse de la siguiente manera al usar esto:

 db.users.aggregate( [ { $group: { _id: "$username", tags_count: {$first: {$size: "$tags" }} } } ] ) 

o

 db.users.aggregate( [ { $project: { tags_count: {$size: "$tags"} } } ] ) 

si el nombre de usuario Alex es único, puede usar el siguiente código:

 db.test.insert({username:"Alex", tags: ['C#', 'Java', 'C++'] }); db.test.aggregate( {$match: {username : "Alex"}}, {$unwind: "$tags"}, {$project: {count:{$add:1}}}, {$group: {_id: null, number: {$sum: "$count" }}} ); { "result" : [ { "_id" : null, "number" : 3 } ], "ok" : 1 } 

Creo que podría ser más eficiente calcular el número de tags en cada guardado (como un campo separado) utilizando $ inc tal vez o mediante un trabajo en un cronogtwig.

También podría hacer esto con map / reduce (el ejemplo canónico ) pero eso no parece ser lo que usted desearía.

No estoy seguro de que sea posible hacer exactamente lo que está preguntando, pero puede consultar todos los documentos que coinciden con un tamaño determinado con $ size …

 > db.collection.find({ tags : { $size: 3 }}); 

Eso te daría todos los documentos con 3 tags …

La respuesta de xmm.dev se puede simplificar: en lugar de tener el campo interm ‘recuento’, puede sumr directamente en $ grupo:

 db.test.aggregate( {$match: {username : "Alex"}}, {$unwind: "$tags"}, {$group: {_id: null, number: {$sum: 1 }}} ) 

Actualmente, la única forma de hacerlo parece ser usar db.eval , pero esto bloquea la base de datos para otras operaciones .

La forma más eficiente de velocidad sería agregar un campo adicional que almacena la longitud de la matriz y mantenerla mediante las operaciones $ inc y $ push .

Hice un pequeño trabajo, ya que necesitaba consultar el tamaño de la matriz y devolver si era mayor que 0, pero podría ser cualquier cosa entre 1 y 3.

Aquí estaba mi solución:

 db.test.find($or : [{$field : { $exists : true, $size : 1}}, {$field : { $exists : true, $size : 2}}, {$field : { $exists : true, $size : 3}}, ]) 

Esto básicamente devuelve un documento cuando existe el atributo y el tamaño es 1, 2 o 3. El usuario puede agregar más instrucciones e incrementar si están buscando un tamaño específico o dentro de un rango. Sé que no es perfecto, pero funcionó y fue relativamente rápido. Solo tenía 1-3 tamaños en mi atributo, así que esta solución funcionó.