内部数组的Mongodb count()

时间:2014-11-19 11:41:49

标签: mongodb mongodb-query

我有以下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'})

将返回学生证件。如何找到“科目”的计数?它是否可以在简单的查询中使用?

3 个答案:

答案 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)

您可以使用aggregation framework

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;
});

谢谢!