我有一个集合,集合中的每个文档都有一个名为foo
的数组,其中包含一组嵌入的文档。 MongoDB shell中目前有一种简单的方法可以计算foo
内的实例数量吗?类似的东西:
db.mycollection.foos.count()
或db.mycollection.foos.size()
?
数组中的每个文档都需要有一个唯一的foo_id
,我想快速计算一下,以确保集合中的随机文档中有适当数量的元素。
答案 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"},
}
}
]
)