MongoDB:计算数组中的项数

时间:2014-01-27 17:49:16

标签: mongodb mongoid

我有一个集合,集合中的每个文档都有一个名为foo的数组,其中包含一组嵌入的文档。 MongoDB shell中目前有一种简单的方法可以计算foo内的实例数量吗?类似的东西:

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

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

3 个答案:

答案 0 :(得分:40)

在MongoDB 2.6中,聚合框架有一个可以使用的新数组$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 }

答案 1 :(得分:18)

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

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

将为您提供收藏的总foo个。

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

答案 2 :(得分:0)

使用投影和分组

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

也可以通过这种方式计算多个子数组计数

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"},
            }
        }
    ]
)