Arrays MongoDB项目数组文档大小与条件

Arrays MongoDB项目数组文档大小与条件,arrays,mongodb,aggregation-framework,Arrays,Mongodb,Aggregation Framework,假设我有以下文档结构: { "_id": "ID", "array": [ { "a": "A", "b": "B", "c": { "x": true, "y": true, "z": false } }, { "a": "A", "b": "B" }, { "a": "A", "b": "B"

假设我有以下文档结构:

{
  "_id": "ID",
  "array": [
    {
      "a": "A",
      "b": "B",
      "c": {
        "x": true,
        "y": true,
        "z": false
      }
    },
    {
      "a": "A",
      "b": "B"
    },
    {
      "a": "A",
      "b": "B"
      "c": {
        "s": true
      }
    }
  ]
}
我正在尝试进行一次聚合,该聚合为我提供了这种类型的输出:

{
  "_id": "ID",
  "array": [
    {
      "a": "A",
      "b": "B",
      "c": 2
    },
    {
      "a": "A",
      "b": "B",
      "c": 0
    },
    {
      "a": "A",
      "b": "B"
      "c": 1
    }
  ]
}
因此,我要做的是,而不是文档
c
,返回
true
作为值的元素数。与示例中一样,
c
字段不一定存在(在这种情况下,我想返回0),当它存在时,它的子字段不一定与数组中的其他
c
子字段相同。假设我正在进行聚合:

db.collection.aggregate([
  {"$match": {<conditions>}},
  {"$project": {
    "array.a": 1,
    "array.b": 1,
    "array.c": <?>,
  }}
])
db.collection.aggregate([
{“$match”:{},
{“$project”:{
“array.a”:1,
“array.b”:1,
“array.c”:,
}}
])

如何在投影中调整
“array.c”
,以实现我的目标?

您至少需要有MongoDB v3.4.4

投影
“array.a”:1
将返回
[“a”、“a”、“a”]
。 由于您的
数组
字段是一个数组,我们需要使用
$map
运算符进行迭代

要迭代对象键,我们需要使用运算符将其转换为数组

"c": {                   "c": [
    "x": true,             {k: "x", v: true},
    "y": true,       ->    {k: "y", v: true},
    "z": false             {k: "z", v: false},
  }                      ]
然后,我们应用
$filter
操作符来获得
k:v
对,其
v
true


聚合投影操作符可以将
c
对象转换为数组,并且可以计算数组元素。
db.collection.aggregate([
  {
    $match: {}
  },
  {
    $project: {
      array: {
        $map: {
          input: "$array",
          as: "arr",
          in: {
            a: "$$arr.a",
            b: "$$arr.b",
            c: {
              $size: {
                $filter: {
                  input: {
                    $objectToArray: {
                      $ifNull: [
                        "$$arr.c",
                        {}
                      ]
                    }
                  },
                  cond: {
                    $eq: [
                      "$$this.v",
                      true
                    ]
                  }
                }
              }
            }
          }
        }
      }
    }
  }
])