MongoDB: cuenta el número de elementos en una matriz
Tengo una colección donde cada documento de la colección tiene una matriz denominada foo
que contiene un conjunto de documentos incrustados. ¿Existe actualmente una forma trivial en el shell de MongoDB de contar cuántas instancias hay foo
? algo como:
db.mycollection.foos.count()
o db.mycollection.foos.size()
?
Cada documento de la matriz debe tener un documento único foo_id
y quiero hacer un recuento rápido para asegurarme de que haya la cantidad correcta de elementos dentro de una matriz para un documento aleatorio de la colección.
En MongoDB 2.6, Aggregation Framework tiene un nuevo $size
operador de matriz que puede usar:
> db.mycollection.insert({'foo':[1,2,3,4]})
> db.mycollection.insert({'foo':[5,6,7]})
> db.mycollection.aggregate([{$project: { count: { $size:"$foo" }}}])
{ "_id" : ObjectId("5314b5c360477752b449eedf"), "count" : 4 }
{ "_id" : ObjectId("5314b5c860477752b449eee0"), "count" : 3 }
Si tiene una versión reciente de mongo (2.2 y posterior), puede utilizar el marco de agregación.
db.mycollection.aggregate([
{$unwind: '$foo'},
{$group: {_id: '$_id', 'sum': { $sum: 1}}},
{$group: {_id: null, total_sum: {'$sum': '$sum'}}}
])
lo que te dará el total foo
de tu colección.
Omitir el último group
agregará resultados por registro.
Usar proyecciones y grupos
db.mycollection.aggregate(
[
{
$project: {
_id:0,
foo_count:{$size:"$foo"},
}
},
{
$group: {
foo_total:{$sum:"$foo_count"},
}
}
]
)
También se pueden calcular varios recuentos de matrices secundarias de esta manera
db.mycollection.aggregate(
[
{
$project: {
_id:0,
foo1_count:{$size:"$foo1"},
foo2_count:{$size:"$foo2"},
}
},
{
$group: {
foo1_total:{$sum:"$foo1_count"},
foo2_total:{$sum:"$foo2_count"},
}
}
]
)