【问题标题】:Mongodb how to calculate array size?Mongodb如何计算数组大小?
【发布时间】:2018-08-26 07:49:57
【问题描述】:

我有两个集合来从中获取数据,我的第一个集合是posts,第二个集合是company,我想列出帖子,以及公司的简要信息(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 存在,0 不存在。

【问题讨论】:

  • 你能告诉我返回你1作为数组长度的查询吗
  • @Kannan 查询我在我的问题中发布的该数据返回评论长度为 1,但如您所见,我的评论数组有两个对象。

标签: mongodb mongoose aggregation-framework lookup


【解决方案1】:

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

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

其余代码保持不变。

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

【讨论】:

  • 语法错误,"in":"$$companyDetailOne.reviews" }中出现意外字符串
猜你喜欢
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多