我正在使用 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
}
]
}
一种选择是将
$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
进行了更新。