MongoDB。需要计算数组的字段

时间:2014-10-06 13:15:04

标签: mongodb

我有一个如下所示的集合

{  _id: 1,  zipcode: "63109",  students: [
                   { name: "john", school: 102, age: 10 },
                   { name: "jess", school: 102, age: 11 },
                   { name: "jeff", school: 108, age: 15 }
                ] }



{  _id: 2,  zipcode: "63110",  students: [
                   { name: "ajax", school: 100, age: 7 },
                   { name: "achilles", school: 100, age: 8 },
                ] }

 {  _id: 3,  zipcode: "63109",  students: [
                   {  school: 100, age: 7 },
                   {  school: 100, age: 8 },
                ] }

 {  _id: 4,  zipcode: "63109",  students: [
                   { name: "barney", school: 102, age: 7 },
                   { name: "ruth", school: 102, age: 16 },
                ] }

注意:某些文档没有名称字段。

我想知道名字字段的数量。 请建议查询以在mongo中查找计数

3 个答案:

答案 0 :(得分:2)

您可以使用$unwind聚合框架执行此操作。假设您的收藏名称为test

db.test.aggregate(
    {$unwind: '$students'}, 
    {$match:{'students.name':{$exists:1}}},
    {$group:{_id: '$students.name', count:{$sum:1}}},
    {$project:{tmp:{name:'$_id', count:'$count'}}}, 
    {$group:{_id:'Total Names', total:{$sum:1}, data:{$addToSet:'$tmp'}}}
) 

希望这就是你想要的!

答案 1 :(得分:0)

在这种情况下,您需要使用聚合框架。

第一个聚合步骤是使用$unwind将数组转换为文档流。

然后,您可以使用$group作为第二个聚合步骤$sum:1来获取每个名称的计数。

db.collection.aggregate([    
    { 
        $unwind: "$students" 
    },
    { 
        $group: {
            _id:"$students.name",
            count: { $sum:1 }
        }
    }    
]

答案 2 :(得分:0)

这可以通过聚合框架

来实现

我假设你的收藏名为mycoll:

db.mycoll.aggregate([
    {$unwind:'$students'},
    {$group:{_id:'$name', 'count':{$sum:1}},
    {$match:{'students.name':{$exists:1}}}
    ]);

参考文献: 汇总http://docs.mongodb.org/manual/tutorial/aggregation-zip-code-data-set/ 存在:http://docs.mongodb.org/manual/reference/operator/query/exists/ 求和'1'基本上将其变为计数。