Mongodb如何计算数组大小?

时间:2018-03-17 09:19:36

标签: mongodb mongoose aggregation-framework lookup

我有两个集合来从中获取数据,我的第一个集合是posts,第二个集合是company,我想列出帖子,还有公司的简要详细信息({{1到目前为止我尝试的是:

rating, totalReviews

内部db.getCollection('posts').aggregate([ {"$match":{ // My match conditions }}, {"$lookup":{ "from":"companies", "localField":"company.id", "foreignField":"_id", "as":"companyDetails" }}, {"$match":{ "companyDetails":{"$ne":[]} }}, {"$project":{ "companyDetails.totalReviews":{"$size":{"$ifNull":["$companyDetails.reviews",[]]}}}} ]) 集合company字段是一个包含对象的数组。

reviews

我想要的是获取此数组的长度,例如"reviews" : [ { "description" : "Five star company", "userId" : ObjectId("5a82831c0b74a9276c3f826b"), "_id" : ObjectId("5a9e6d2c38368b365c22a49d"), "rating" : 4 }, { "description" : "The best IT solution company.", "userId" : ObjectId("5a827d868219d03730085803"), "_id" : ObjectId("5aacb5335b9f3e52dc99e1f2"), "rating" : 5 } ], ,但我的查询总是返回2,如果1存在,则reviews不存在。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下项目阶段。

由于lookup返回数组,因此使用$ let获取公司详细信息文档,然后投影到输出评论。

其余代码保持不变。

{
  "$project": {
    "companyDetails.totalReviews": {
      "$size": {
        "$ifNull": [
          {
            "$let": {
              "vars": {
                "companyDetailOne": {
                  "$arrayElemAt": [
                    "$companyDetails",
                    0
                  ]
                }
              },
              "in": "$$companyDetailOne.reviews"
            }
          },
          []
        ]
      }
    }
  }
}