MongoDB:计算数组中的项数

ran*_*its 22 mongodb mongoid

我有一个集合,集合中的每个文档都有一个名为foo包含一组嵌入文档的数组.MongoDB shell中目前有一种简单的方法来计算其中有多少个实例foo?就像是:

db.mycollection.foos.count()还是db.mycollection.foos.size()

数组中的每个文档都需要具有唯一性foo_id,我想快速计算以确保在集合中的适当随机文档的数组中包含适量的元素.

Ste*_*nie 44

在MongoDB 2.6中,Aggregation Framework有一个$size可以使用的新数组运算符:

> 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 }
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,有什么办法可以得到 7 (4+3) 吗? (3认同)
  • @xxbidiao当然,只需使用一个$ group阶段来汇总数组大小:db.mycollection.aggregate({$ group:{_id:null,totalSize:{$ sum:{$ size:“ $ foo”} }}})`。 (2认同)

xle*_*ras 21

如果您使用的是最新版本的mongo(2.2及更高版本),则可以使用聚合框架.

db.mycollection.aggregate([
  {$unwind: '$foo'},
  {$group: {_id: '$_id', 'sum': { $sum: 1}}},
  {$group: {_id: null, total_sum: {'$sum': '$sum'}}}
])
Run Code Online (Sandbox Code Playgroud)

这将为foo您提供收藏的总数.

省略最后一个group将汇总每条记录的结果.

  • 太棒了,对我也有帮助。您能否建议我如何在进一步计算中访问“total_sum”? (2认同)

Chi*_*ndo 5

使用投影和组

db.mycollection.aggregate(
    [
        {
            $project: {
                _id:0,
                foo_count:{$size:"$foo"},
            }
        }, 
        {
            $group: {
                foo_total:{$sum:"$foo_count"},
            }
        }
    ]
)
Run Code Online (Sandbox Code Playgroud)

多个子数组计数也可以这样计算

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"},
            }
        }
    ]
)
Run Code Online (Sandbox Code Playgroud)

  • 无论如何要保护文档中是否缺少数组? (3认同)