MongoDB在$ lookup阶段聚合$ elemMatch

时间:2018-02-10 14:41:35

标签: mongodb mongodb-query aggregation-framework

我有一个看起来像这样的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属性,这给了我相同的结果。 我做错了什么?

1 个答案:

答案 0 :(得分:2)

使用您提供的文件。我相信这可能适合你:

我已使用$lookup加入包含playerId的集合,这会创建一个名为array的{​​{1}}。然后,我使用field$unwindfield中提取所有数组元素。最后,如果两个值匹配,我使用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 ] 
      } } }
    ])