MongoDB: cuenta el número de elementos en una matriz

Resuelto randombits asked hace 10 años • 0 respuestas

Tengo una colección donde cada documento de la colección tiene una matriz denominada fooque 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_idy 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.

randombits avatar Jan 28 '14 00:01 randombits
Aceptado

En MongoDB 2.6, Aggregation Framework tiene un nuevo $sizeoperador 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 }
Stennie avatar Mar 03 '2014 17:03 Stennie

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 foode tu colección.

Omitir el último groupagregará resultados por registro.

xlembouras avatar Jan 27 '2014 18:01 xlembouras

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"},
            }
        }
    ]
)
Chinthaka Fernando avatar Oct 06 '2020 09:10 Chinthaka Fernando