匹配/过滤/项目对象中数组中数组的嵌套字段

问题描述 投票:0回答:1

我需要一点帮助,我尝试从嵌套数组中提取一些字段,但仍然很困难,有人可以帮忙吗?

这是示例文档:

[
{
_id: 1,
"_a": [
  {
    "_p": [
      {
        _pubId: {
          "CC": "EN"
        },
        _prid: "2",
        s: {
          c: {
            text: [
              {
                secId: "4"
              },
              {
                secId: "5"
              }
            ]
          },
          d: {
            text: [
              {
                secId: "6"
              },
              {
                secId: "7"
              }
            ]
          }
        }
      },
      {
        _pubId: {
          "CC": "CZ"
        },
        _prid: "4",
        s: {
          c: {
            text: [
              {
                secId: "8"
              },
              {
                secId: "9"
              }
            ]
          }
        }
      }
    ]
  },
  {
    "_p": [
      {
        _pubId: {
          "CC": "CZ"
        },
        _prid: "200",
        s: {
          c: {
            text: [
              {
                secId: "4"
              },
              {
                secId: "5"
              }
            ]
          },
          d: {
            text: [
              {
                secId: "6"
              },
              {
                secId: "7"
              }
            ]
          }
        }
      },
      {
        _pubId: {
          "CC": "BG"
        },
        _prid: "4",
        s: {
          c: {
            text: [
              {
                secId: "8"
              },
              {
                secId: "9"
              }
            ]
          }
        }
      }
    ]
  }
 ]
}
]

我需要仅为“_a._p._pubId.CC”:“EN”提取所有“_a._p.s.[d|c].text.secId”,输出需要如下所示:

_prid , secId
{ _prid:2 , secId:4 }
{ _prid:2 , secId:5 }
{ _prid:2 , secId:6 }
{ _prid:2 , secId:7 }

示例游乐场

mongodb aggregation-framework aggregate
1个回答
0
投票

这非常丑陋,需要在更大的集合上进行测试,但这似乎输出了你想要的。

db.collection.aggregate([
  {"$unwind": "$_a"},
  {"$unwind": "$_a._p"},
  {
    "$match": {
      "_a._p._pubId.CC": "EN"
    }
  },
  {
    "$group": {
      "_id": "$_a._p._prid",
      "pridOut": {
        "$push": {
          "$reduce": {
            "input": {"$objectToArray": "$_a._p.s"},
            "initialValue": [],
            "in": {
              "$concatArrays": [
                "$$value",
                {
                  "$reduce": {
                    "input": "$$this.v.text",
                    "initialValue": [],
                    "in": {"$concatArrays": ["$$value", ["$$this"]]}
                  }
                }
              ]
            }
          }
        }
      }
    }
  },
  {
    "$set": {
      "pridOut": {
        "$reduce": {
          "input": "$pridOut",
          "initialValue": [],
          "in": {"$setUnion": ["$$value", "$$this"]}
        }
      }
    }
  },
  {
    "$set": {
      "pridOut": {
        "$map": {
          "input": "$pridOut",
          "as": "eachSecId",
          "in": {"$mergeObjects": [{"_prid": "$_id"}, "$$eachSecId"]}
        }
      }
    }
  },
  {"$unwind": "$pridOut"},
  {"$replaceWith": "$pridOut"}
])

使用您的样本集合进行输出:

[
  {"_prid": "2", "secId": "4"},
  {"_prid": "2", "secId": "5"},
  {"_prid": "2", "secId": "6"},
  {"_prid": "2", "secId": "7"}
]

mongoplayground.net 上尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.