如何从MongoDB中的双层嵌套数组中获取特定对象数据

huangapple go评论51阅读模式
英文:

How can get particular object data from double nested array in mongodb

问题

我是MongoDB新手,我只想获取ID为5689746的单个对象数据,我应该用什么方式获取?

我正在使用$elemMatch,但我没有得到预期的结果。

我希望结果如下:

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

i m new in mongodb, i want only single object data which id is 5689746, by which way can i get this?

[
  {
    "_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
          }
        ]
      }
    ]
  }
]

i m using $elemMatch but i didn't get result as expected

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

i want result like

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

答案1

得分: 2

你需要将$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

英文:

You need to chain up $filter and $mergeObjects as you are doubly nesting your array fields.

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

huangapple
  • 本文由 发表于 2023年2月7日 04:05:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/75366048.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定