我有以下MongoDB集合db.students:
/* 0 */
{
"id" : "0000",
"name" : "John"
"subjects" : [
{
"professor" : "Smith",
"day" : "Monday"
},
{
"professor" : "Smith",
"day" : "Tuesday"
}
]
}
/* 1 */
{
"id" : "0001",
"name" : "Mike"
"subjects" : [
{
"professor" : "Smith",
"day" : "Monday"
}
]
}
我想找一个给定学生的科目数。我有一个问题:
db.students.find({'id':'0000'})
将返回学生证件。如何找到“科目”的计数?它是否可以在简单的查询中使用?
答案 0 :(得分:3)
如果查询只返回一个元素:
db.students.find({'id':'0000'})[0].subjects.length;
对于游标中的多个元素:
db.students.find({'id':'0000'}).forEach(function(doc) {
print(doc.subjects.length);
})
不要忘记在查询中或在检查.length
答案 1 :(得分:2)
db.students.aggregate(
[
{ $match : {'_id': '0000'}},
{ $unwind : "$subjects" },
{ $group : { _id : null, number : { $sum : 1 } } }
]
);
$match
阶段将根据学生的_id $unwind
阶段会将您的主题数组解构为多个文档$group
阶段是计数完成的时间。 _id为null,因为您只对一个用户进行计数,只需要计数。您将获得如下结果:
{ "result" : [ { "_id" : null, "number" : 187 } ], "ok" : 1 }
答案 2 :(得分:0)
另一种简单易用的聚合解决方案:
db.students.aggregate([
{ $match : { 'id':'0000' } },
{ $project: {
subjectsCount: { $cond: {
if: { $isArray: "$subjects" },
then: { $size: "$subjects" },
else: 0
}
}
}
}
]).then(result => {
// handle result
}).catch(err => {
throw err;
});
谢谢!