MongoDB聚合中$lookup阶段内的$elemMatch

4

我有一个 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没有被正确地评估,因为如果我用硬编码值(例如A)替换$uuid,这个查询会返回结果。

我也尝试使用let属性,但结果相同。我做错了什么?


1
你能否从集合中发布带有示例文档的内容? - Saravana
我的帖子顶部包含示例文件。 - Joba
1个回答

3
使用您提供的文档,我认为以下内容可能适用于您:
我使用了$lookup来进行连接到保存playerId的集合,从而创建了一个名为fieldarray。然后我使用$unwindfieldplayer中提取所有数组元素。最后,我使用$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
@Joba 你能否请更新一下你的原始帖,加上这个集合的例子呢?那我就可以设置一个测试,看看我是否能够帮忙。目前我只有你问题的一半 :-) - user9251303
更新了原帖并澄清了我的示例。 - Joba
但是为什么主题的初始请求没有起作用呢? - Evgeny Gorbovoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接