遍历mongodb中的双嵌套数组

时间:2018-10-18 10:55:39

标签: mongodb mongodb-query aggregation-framework

我有以下文件:

{
  "_ID": "234",
  "sub": {
    "abcId": "123",
    "subElems": [
      {
        "abcId": "345",
        "subElems": [
          {
            "abcId": "676",
            "subElems": [
              {
                "abcId": "567"
              },
              {
                "abcId": "567b",
                "crit1": false,
                "crit2": "someId",
                "crit3": "2013-07-30T22:00:00.000+0000",
                "crit4": "ABC"
              },
              {
                "abcId": "567c",
                "crit1": true,
                "crit3": "2013-07-30T22:00:00.000+0000",
                "crit4": "ABC"
              },
              {
                "abcId": "567d",
                "crit1": true,
                "crit3": "2018-11-30T22:00:00.000+0000",
                "crit4": "ABC"
              }
            ]
          },
                    {
            "abcId": "678",
            "subElems": [
              {
                "abcId": "568"
              },
              {
                "abcId": "568b",
                "crit1": false,
                "crit2": "someId",
                "crit3": "2013-07-30T22:00:00.000+0000",
                "crit4": "ABC"
              },
              {
                "abcId": "568c",
                "crit1": true,
                "crit3": "2013-07-30T22:00:00.000+0000",
                "crit4": "ABC"
              },
              {
                "abcId": "568d",
                "crit1": true,
                "crit3": "2018-11-30T22:00:00.000+0000",
                "crit4": "ABC"
              }
            ]
          }
        ]
      }
    ]
  }
}

我需要遍历所有sub.subElems.0.subElems(在这种情况下,嵌套文档带有abcId 676和678)

这2个对象中的每个对象都具有一个称为subElems的对象数组。

我需要在此subElems数组中找到与以下条件(AND,而非OR)匹配的所有对象:

crit1 = true
crit4 = ABC
crit2 = null
crit3 = more than a year ago

鉴于上面的collectin,我需要:

567c568c

我尝试了各种汇总。

我认为我可以做类似unwind sub.subElems.0.subElems的事情,然后访问其subElems数组并对其进行迭代。

我不知道该怎么做,是选择一个嵌套的对象对象(我知道其路径),然后遍历此数组中的元素,然后再次遍历那些对象中的数组。

感谢帮助和提示!

1 个答案:

答案 0 :(得分:2)

您可以尝试以下汇总

基本上,每个数组都需要使用$map,最后一个数组需要使用$filter

db.collection.aggregate([
  { "$addFields": {
    "sub.subElems": {
      "$map": {
        "input": "$sub.subElems",
        "as": "s1",
        "in": {
          "abcId": "$$s1.abcId",
          "subElems": {
            "$map": {
              "input": "$$s1.subElems",
              "as": "s2",
              "in": {
                "abcId": "$$s2.abcId",
                "subElems": {
                  "$filter": {
                    "input": "$$s2.subElems",
                    "as": "s3",
                    "cond": {
                      "$and": [
                        { "$eq": ["$$s3.crit1", true] },
                        { "$eq": ["$$s3.crit4", "ABC"] },
                        { "$eq": ["$$s3.crit2", undefined] },
                        { "$lt": ["$$s3.crit3", "2018-11-30T22:00:00.000+0000"] }
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }}
])