我有一个如下所示的集合
{ _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中查找计数
答案 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'基本上将其变为计数。