我有一个看起来像这样的MongoDB集合:
{
players: [
{uuid: "A"},
{uuid: "B"}
]
},
{
players: [
{uuid: "A"},
{uuid: "C"}
]
},
{
players: [
{uuid: "D"},
{uuid: "E"}
]
}
我想使用之前聚合阶段的结果,现在使用$lookup
阶段找到玩家出现的所有文档:
from: "collection",
pipeline: [
{
$match: {
players: {
$elemMatch: {
uuid: "$playerId"
}
}
//using "players.uuid": "$playerId" doesn't work either
}
}
],
as: "field"
$lookup
阶段的输入如下:
{
"playerId" : "A"
}
{
"playerId" : "B"
}
{
"playerId" : "C"
}
此查询在field
中返回一个空数组。好像$uuid
没有得到正确评估,因为如果我用硬编码值(例如$uuid
)交换A
,则此查询会返回结果。
我也尝试过使用let
属性,这给了我相同的结果。
我做错了什么?
答案 0 :(得分:2)
使用您提供的文件。我相信这可能适合你:
我已使用$lookup
加入包含playerId
的集合,这会创建一个名为array
的{{1}}。然后,我使用field
从$unwind
和field
中提取所有数组元素。最后,如果两个值匹配,我使用player
进行交叉检查。
$cond
我故意将输出详细说明..
db.getCollection('foo').aggregate([
{ $lookup : {
from: "bar",
localField: "players.uuid",
foreignField: "playerId",
as: "field"
} },
{ $unwind : "$players" },
{ $unwind : "$field" },
{ $project : {
"players": 1,
"field" : 1,
"isMatch": {
"$cond": [ { "$eq": ["$players.uuid", "$field.playerId"] }, 1, 0 ]
} } }
])