$lookup 阶段内的 MongoDB 聚合 $elemMatch

标签 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属性(property),这给了我同样的结果。
我究竟做错了什么?

最佳答案

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

我用过 $lookup加入包含 playerId 的集合,这会创建一个 arrayfield .然后我使用 $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 ] 
      } } }
    ])

我故意让输出详细..
/* 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
}

关于$lookup 阶段内的 MongoDB 聚合 $elemMatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48721925/

相关文章:

MongoDB : How do the stored objects are affected by model changes?

javascript - 将图像路径保存到mongodb的方式是什么?

node.js - Mongoose 5.0.16,获取无法读取未定义的属性 'replace'

mongodb - 用mongo同时pull和addtoset

MongoDB 从文档中提取子数组

MongoDB 聚合查询相当于 PostsgreSQL

mongodb - Jest : Expect() only unique elements in an array

mongodb - 如何避免语法错误: missing : after property id @(shell):1:36 on mongoDb?

ruby-on-rails - MongoDB 对 HABTM 关系(Mongoid、RoR)进行条件聚合查询?

mongodb - 将聚合操作合并到单个结果中