MongoDB聚合$elemMatch内$lookup阶段
我有一个MongoDB系列,看起来像这样:MongoDB聚合$elemMatch内$lookup阶段,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个MongoDB系列,看起来像这样: { players: [ {uuid: "A"}, {uuid: "B"} ] }, { players: [ {uuid: "A"}, {uuid: "C"} ] }, { players: [ {uuid: "D"}, {uuid: "E"} ] } { "playerId" : "A" } {
{
players: [
{uuid: "A"},
{uuid: "B"}
]
},
{
players: [
{uuid: "A"},
{uuid: "C"}
]
},
{
players: [
{uuid: "D"},
{uuid: "E"}
]
}
{
"playerId" : "A"
}
{
"playerId" : "B"
}
{
"playerId" : "C"
}
我想使用上一个聚合阶段的结果,现在使用$lookup
阶段查找播放器显示的所有文档:
from: "collection",
pipeline: [
{
$match: {
players: {
$elemMatch: {
uuid: "$playerId"
}
}
//using "players.uuid": "$playerId" doesn't work either
}
}
],
as: "field"
my$lookup
阶段的输入如下所示:
{
players: [
{uuid: "A"},
{uuid: "B"}
]
},
{
players: [
{uuid: "A"},
{uuid: "C"}
]
},
{
players: [
{uuid: "D"},
{uuid: "E"}
]
}
{
"playerId" : "A"
}
{
"playerId" : "B"
}
{
"playerId" : "C"
}
此查询在字段中返回一个空数组。似乎$uuid
的计算结果不正确,因为如果我用硬编码值(例如a
)交换$uuid
,此查询将返回结果
我也尝试过使用let
属性,这给了我同样的结果。
我做错了什么?使用您提供的文档。我相信这可能对你有用:
我使用了$lookup
对包含playerId
的集合进行联接,该集合创建了一个名为字段的数组。然后我使用$unwind
从字段
和播放器
中提取所有数组元素。最后,我使用$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 ]
} } }
])
我故意让输出冗长
/* 1 */
{
"_id" : ObjectId("5a7f534b337e8d2b97ff2ffb"),
"players" : {
"uuid" : "A"
},
"field" : {
"_id" : ObjectId("5a7f5374337e8d2b97ff2ffe"),
"playerId" : "A"
},
"isMatch" : 1.0
}
/* 2 */
{
"_id" : ObjectId("5a7f534b337e8d2b97ff2ffb"),
"players" : {
"uuid" : "A"
},
"field" : {
"_id" : ObjectId("5a7f539b337e8d2b97ff2fff"),
"playerId" : "B"
},
"isMatch" : 0.0
}
/* 3 */
{
"_id" : ObjectId("5a7f534b337e8d2b97ff2ffb"),
"players" : {
"uuid" : "B"
},
"field" : {
"_id" : ObjectId("5a7f5374337e8d2b97ff2ffe"),
"playerId" : "A"
},
"isMatch" : 0.0
}
/* 4 */
{
"_id" : ObjectId("5a7f534b337e8d2b97ff2ffb"),
"players" : {
"uuid" : "B"
},
"field" : {
"_id" : ObjectId("5a7f539b337e8d2b97ff2fff"),
"playerId" : "B"
},
"isMatch" : 1.0
}
/* 5 */
{
"_id" : ObjectId("5a7f5356337e8d2b97ff2ffc"),
"players" : {
"uuid" : "A"
},
"field" : {
"_id" : ObjectId("5a7f5374337e8d2b97ff2ffe"),
"playerId" : "A"
},
"isMatch" : 1.0
}
/* 6 */
{
"_id" : ObjectId("5a7f5356337e8d2b97ff2ffc"),
"players" : {
"uuid" : "A"
},
"field" : {
"_id" : ObjectId("5a7f53a8337e8d2b97ff3000"),
"playerId" : "C"
},
"isMatch" : 0.0
}
/* 7 */
{
"_id" : ObjectId("5a7f5356337e8d2b97ff2ffc"),
"players" : {
"uuid" : "C"
},
"field" : {
"_id" : ObjectId("5a7f5374337e8d2b97ff2ffe"),
"playerId" : "A"
},
"isMatch" : 0.0
}
/* 8 */
{
"_id" : ObjectId("5a7f5356337e8d2b97ff2ffc"),
"players" : {
"uuid" : "C"
},
"field" : {
"_id" : ObjectId("5a7f53a8337e8d2b97ff3000"),
"playerId" : "C"
},
"isMatch" : 1.0
}
你能用样本文档从集合发帖吗?我的帖子的顶部包含样本文档。这是我想加入的字段名,但似乎不起作用。@Joba你能用这个集合的示例更新你的OP吗。然后我可以设置一个测试,看看我是否能提供帮助。目前我只有你一半的问题:-)更新了OP并澄清了我的示例,但为什么按主题开始的初始请求不起作用?