如何在mongodb中从双嵌套数组中获取特定对象数据

gr8qqesn  于 2023-02-07  发布在  Go
关注(0)|答案(1)|浏览(134)

我是mongodb的新手,我只需要ID为5689746的单个对象数据,我可以通过什么方式获得它?

[
  {
    "_id": 8965651651,
    "orditems": [
      {
        "_id": 65748413141,
        "itms": [
          {
            "item1": "aa",
            "item2": "bb",
            "item3": "cc",
            "_id": 7894567
          },
          {
            "item1": "dd",
            "item2": "ee",
            "item3": "ff",
            "_id": 5689746
          },
          {
            "item1": "gg",
            "item2": "hh",
            "item3": "ii",
            "_id": 1644824
          }
        ]
      },
      {
        "_id": 87448413141,
        "itms": [
          {
            "item1": "jj",
            "item2": "kk",
            "item3": "ll",
            "_id": 9874567
          },
          {
            "item1": "mm",
            "item2": "nn",
            "item3": "oo",
            "_id": 8659746
          },
          {
            "item1": "pp",
            "item2": "qq",
            "item3": "rr",
            "_id": 4614824
          }
        ]
      }
    ]
  }
]

我正在使用$elemMatch,但未获得预期结果

db.orders.findOne({
  _id: 8965651651
},
{
  orditems: {
    $elemMatch: {
      _id: 87448413141,
      itms: {
        $elemMatch: {
          _id: 5689746
        }
      }
    }
  }
})

我想要结果

{
    "_id": 8965651651,
    "orditems": [
      {
        "_id": 65748413141,
        "itms": [
          {
            "item1": "dd",
            "item2": "ee",
            "item3": "ff",
            "_id": 5689746
          }
        ]
      }
    ]
  }
ds97pgxw

ds97pgxw1#

您需要将$filter$mergeObjects链接起来,因为您要双重嵌套数组字段。

db.collection.aggregate([
  {
    $match: {
      "_id": 8965651651
    }
  },
  {
    $set: {
      orditems: {
        "$filter": {
          "input": "$orditems",
          "as": "oi",
          "cond": {
            $eq: [
              "$$oi._id",
              65748413141
            ]
          }
        }
      }
    }
  },
  {
    $set: {
      orditems: {
        "$map": {
          "input": "$orditems",
          "as": "oi",
          "in": {
            "$mergeObjects": [
              "$$oi",
              {
                itms: {
                  "$filter": {
                    "input": "$$oi.itms",
                    "as": "i",
                    "cond": {
                      $eq: [
                        "$$i._id",
                        5689746
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

Mongo Playground

相关问题