在mongodb

时间:2018-10-19 09:31:29

标签: mongodb mongoose aggregation-framework

在下面的文档结构中,我需要找到数组“ X”中的元素总数以及“ X”中状态“ a”的总数。

 [
      {
        X: [
          {
            Y: [
              {
                STATUS: "a"
              },
              {
                STATUS: "b"
              },
              {
                STATUS: "c"
              }
            ]
          },
          {
            Y: [
              {
                STATUS: "a"
              },
              {
                STATUS: "b"
              },
              {
                STATUS: "c"
              }
            ]
          }
        ]
      }
    ]

此处所需的结果将是“ X”中元素的总数为2,而“ X”中状态“ a”的总数为2。

已尝试但无法在单个查询中获取准确的数据。

1 个答案:

答案 0 :(得分:1)

您需要$size来获取数组的长度,并且需要$filter来应用状态a的条件。然后,您可以使用$reducea数组简单地求和所有X。试试:

db.collection.aggregate([
    {
        $project: {
            total_a: { 
                $reduce: {
                    input: "$X",
                    initialValue: 0,
                    in: {
                        $add: [ "$$value", 
                            { $size: { $filter: { input: "$$this.Y", as: "yy", cond: { $eq: [ "$$yy.STATUS", "a" ] } } } } 
                        ]
                    }
                }
            },
            total_X: { $size: "$X" }
        }
    }
])

游乐场here