Mongodb-在$ unwind之后在一个嵌套数组中分组

时间:2018-08-09 10:56:41

标签: arrays mongodb mongodb-query aggregation-framework

我要查询的集合包含具有以下结构的文档-

{
  "_id": 1,
  "topA": "topAValue",
  "topB": "topBValue",
  "topC": "topCValue",
  "nestedDocArray": [
    {
      "attr1": "a",
      "attr2": "b",
      "attr3": "c",
      "subnestedDocArray": [
        {
          "subAttr1": "asub1",
          "subAttr2": "bsub1",
          "subAttr3": "csub1"
        },
        {
          "subAttr1": "asub2",
          "subAttr2": "bsub2",
          "subAttr3": "csub2"
        },
        {
          "subAttr1": "asub3",
          "subAttr2": "bsub3",
          "subAttr3": "csub3"
        }
      ]
    },
    {
      "attr1": "a5",
      "attr2": "b5",
      "attr3": "c5",
      "subnestedDocArray": [
        {
          "subAttr1": "a5sub1",
          "subAttr2": "b5sub1",
          "subAttr3": "c5sub1"
        },
        {
          "subAttr1": "a5sub2",
          "subAttr2": "b5sub2",
          "subAttr3": "c5sub2"
        },
        {
          "subAttr1": "a5sub3",
          "subAttr2": "b5sub3",
          "subAttr3": "c5sub3"
        }
      ]
    },
    {
      "attr1": "a1000",
      "attr2": "b1000",
      "attr3": "c1000",
      "subnestedDocArray": [
        {
          "subAttr1": "a1000sub1",
          "subAttr2": "b1000sub1",
          "subAttr3": "c1000sub1"
        },
        {
          "subAttr1": "a1000sub2",
          "subAttr2": "b1000sub2",
          "subAttr3": "c5sub2"
        },
        {
          "subAttr1": "a1000sub3",
          "subAttr2": "b1000sub3",
          "subAttr3": "c1000sub3"
        }
      ]
    }
  ]
}

我的要求是投影topA,topB,topC值以及nestedDocArray.attr2和nestedDocArray.subnestedDocArray.subAttr2。我将选择文档的第一个查询将是“ _id”:1.我需要nestedDocArray中的元素,其nestedDocArray.attr1 =“ a5”。此外,我需要使用[“ a5sub1”,“ a5sub2”]中的nestedDocArray.subnestedDocArray.subAttr1来过滤subnestedDocArray中的元素。

到目前为止,我有以下查询-

db.testCollection.aggregate(
[
  {
    "$match": {
      "_id": 1
    }
  },
  {
    "$unwind": "$nestedDocArray"
  },
  {
    "$match": {
      "$nestedDocArray.attr1": {
        "$eq": "a5"
      }
    }
  },
  {
    "$unwind": "$nestedDocArray.subnestedDocArray"
  },
  {
    "$match": {
      "$nestedDocArray.subnestedDocArray.attr1": {
        "$in": ["a5sub1", "a5sub2"]
      }
    }
  }
]
);

这将导致以下结果-

[
  {
    "_id": 1,
    "topA": "topAValue",
    "topB": "topBValue",
    "topC": "topCValue",
    "nestedDocArray": {
      "attr1": "a5",
      "attr2": "b5",
      "attr3": "c5",
      "subnestedDocArray": {
        "subAttr1": "a5sub1",
        "subAttr2": "b5sub1",
        "subAttr3": "c5sub1"
      }
    }
  },
  {
    "_id": 1,
    "topA": "topAValue",
    "topB": "topBValue",
    "topC": "topCValue",
    "nestedDocArray": {
      "attr1": "a5",
      "attr2": "b5",
      "attr3": "c5",
      "subnestedDocArray": {
        "subAttr1": "a5sub2",
        "subAttr2": "b5sub2",
        "subAttr3": "c5sub2"
      }
    }
  }
]

可以在聚合管道的最末端添加必要属性的投影。 但是,$ unwind已完全破坏了文档的结构。是否可以对展开的属性进行风/分组?我正在寻找保留集合原始文档结构的输出。

我正在寻找的输出如下-

{
  "_id": 1,
  "topA": "topAValue",
  "topB": "topBValue",
  "topC": "topCValue",
  "nestedDocArray": [
    {
      "attr2": "b5",
      "subnestedDocArray": [
        {
          "subAttr2": "b5sub1"
        },
        {
          "subAttr2": "b5sub2"
        }
      ]
    }
  ]
}

0 个答案:

没有答案