Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mongodb中迭代双嵌套数组_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

在mongodb中迭代双嵌套数组

在mongodb中迭代双嵌套数组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有以下文件: { "_ID": "234", "sub": { "abcId": "123", "subElems": [ { "abcId": "345", "subElems": [ { "abcId": "676", "subElems": [ { "abcId": "567"

我有以下文件:

{
  "_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的嵌套文档)

这两个元素中的每一个都有一个名为
子元素的对象数组

我需要在此
子元素
数组中查找符合以下条件(AND、not或)的所有项目:

鉴于上述情况,我需要:

567c
568c

我尝试过各种聚合

我想我可以做一些类似于
展开sub.subElems.0.subElems
的事情,然后访问它的
subElems
数组并对其进行迭代

我不知道如何做的是选择一组嵌套的对象(我知道它们的路径),然后迭代这个数组中的元素,再迭代这些对象中的数组


谢谢你的帮助和提示

您可以在下面尝试

基本上,您需要使用每个数组和最后一个数组

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"] }
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }}
])

嗨,非常感谢!我如何更改此项以便取回整个文档?为什么您会特别地使用“abcId”:“$$s1.abcId”?我删除了它,我似乎仍然可以工作。是的,它可以工作,但是你的
abcId
键将从嵌套数组中消失,你将只得到
子元素,我们在
$map
函数的
in
表达式中定义了它
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"] }
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }}
])