Mongodb如何计算数组大小?

Mongodb如何计算数组大小?,mongodb,mongoose,aggregation-framework,lookup,Mongodb,Mongoose,Aggregation Framework,Lookup,我有两个收集来从他们那里获取数据,第一个收集是帖子,第二个收集是公司,我想列出帖子,以及公司的简要细节(评级,totalReviews),到目前为止我尝试的是: db.getCollection('posts').aggregate([ {"$match":{ // My match conditions }}, {"$lookup":{ "from":"companies", "localField":"company.i

我有两个收集来从他们那里获取数据,第一个收集是
帖子
,第二个收集是
公司
,我想列出帖子,以及公司的简要细节(
评级,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
collection
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
,如果
检查了
是否存在,如果
0
不存在。

您可以在项目阶段下尝试

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

代码的其余部分保持不变

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

你能给我看一下返回数组为1的查询吗length@Kannan我在问题中发布的查询返回该数据的评论长度1,但正如您所看到的,我的评论数组有两个对象。它有一个语法错误,
“in:“$$companyDetailOne.reviews”}