MongoDB $lookup 查找字段值数组

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

我正在使用 MongoDB,我尝试使用许多管道步骤来完成它,但我找不到方法。

我有一个玩家集合,每个玩家都包含一个项目数组

{
    "_id": ObjectId("5fba17c1c4566e57fafdcd7e"),
    "username": "moshe",
    "items": [ 
        "5fbb5ab778045a985690b5fc",
        "5fbb5ab778045a985690b5fd"
    ]
}

我有一个项目集合,其中有有关播放器项目数组中每个项目的更多信息。

{
    "_id": ObjectId("5fbb5ab778045a985690b5fc"),
    "name": "Axe",
    "damage": 4,
    "defense": 6
}
{
    "_id": ObjectId("5fbb5ab778045a985690b5fd"),
    "name": "Demo",
    "damage": 1,
    "defense": 1
}

我的目标是拥有一个玩家文档,其中包含有关其项目数组中的项目的所有信息,因此它看起来像这样:

{
    "_id": ObjectId("5fba17c1c4566e57fafdcd7e"),
    "username": "moshe",
    "items": [
        {
            "_id": ObjectId("5fbb5ac178045a985690b5fd"),
            "equipped": false,
            "itemId": "5fbb5ab778045a985690b5fc",
            "name": "Axe",
            "damage": 4,
            "defense": 6
        },
        {
            "_id": ObjectId("5fbb5ac178045a985690b5fa"),
            "equipped": false,
            "itemId": "5fbb5ab778045a985690b5fd",
            "name": "Demo",
            "damage": 1,
            "defense": 1
        }
    ]
}
mongodb mongodb-query aggregate lookup
1个回答
1
投票

一种选择是将

$lookup
与管道一起使用,以克服
ObjectId
string
之间的差异:

db.players.aggregate([
  {$lookup: {
      from: "items",
      let: {items: {$ifNull: ["$items", []]}},
      pipeline: [
        {$match: {$expr: {$in: [{$toString: "$_id"}, "$$items"]}}}
      ],
      as: "items"
    }
  }
])

查看它在 playground 示例中的工作原理

  • 如评论中所述,对于没有
    $ifNull
    字段的情况,使用
    items
    进行了更新。
© www.soinside.com 2019 - 2024. All rights reserved.