在mongodb中从嵌套数组文档的第三级查找计数

时间:2018-10-19 07:41:09

标签: mongodb mongoose aggregation-framework

我需要在单个查询中找到状态为'a'的计数以及数组'Y'中元素的总数,其中'X''Y'是嵌套数组文件。

集合类似于以下内容:

{
   X: [
    {
       Y:[
          {
            STATUS: 'a' 
          },
          {
            STATUS: 'a' 
          },
          {
            STATUS: 'b' 
          }
         ]
    } 
    ]
}

一个mongodb查询,用于查找状态'a'的计数和数组'Y'中元素的总数。

必需的结果是'a'的计数为2,而'Y'中元素的总数为3

2 个答案:

答案 0 :(得分:1)

您可以使用以下汇总

首先使用$map遍历X数组,然后使用$filter删除不匹配的元素。

db.collection.aggregate([
  { "$project": {
    "X": {
      "$map": {
        "input": "$X",
        "as": "x",
        "in": {
          "aCount": {
            "$size": {
              "$filter": {
                "input": "$$x.Y",
                "cond": { "$eq": ["$$this.STATUS", "a"] }
              }
            }
          },
          "allCount": { "$size": "$$x.Y" }
        }
      }
    }
  }}
])

答案 1 :(得分:1)

您可以使用$map转换数组,并使用$filter检查状态是否等于"a"$size为您提供数组中元素的数量。试试:

db.collection.aggregate([
    {
        $project: {
            X: {
                $map: {
                    input: "$X",
                    as: "xx",
                    in: {
                        Y: {
                            total: { $size: "$$xx.Y" },
                            a: { $size: { $filter: { input: "$$xx.Y", as: "yy", cond: { $eq: [ "$$yy.STATUS", "a" ] }  } } }
                        }
                    }
                }
            }
        }
    }
])