【问题标题】:$lookup and $match Mongodb golang$lookup 和 $match Mongodb golang
【发布时间】:2017-08-21 19:12:42
【问题描述】:

我想通过在 MongoDB 上使用 $lookup 和 $match 来获取带有外键的文档。

有一个“Jobs”集合存储 Job 文档。在 Job 文档中有两个字段用作外键“creatorParent”和“Children”。 CreatorParent 是“Users”集合的外键,Children 数组包含用户孩子的 id。

当我列出整个作业时,我想从“用户”集合中检索 CreatorParent ID 和 ChildrenID 的详细信息。我想用 ParentDetail 和 ChildDetail 编组“作业”文档。我不想为此编写自定义方法。是否可以用 MongoDB 查询来处理?

顺便说一句,我是 MongoDB 的初学者,所以应该在 Children 和 CreatorParent 上存储所需的详细信息,而不是存储 ObjectId?

用户文档:

{
    "_id" : ObjectId("58daf84877733645eaa9b44f"),
    "email" : "meto93@gmail.com",
    "password" : "vpGl+Fjnef616cRgNbCkwaFDpSI=",
    "passwordsalt" : "99397F4A9D3A499D96694547667E74595CE994D2E83345D6953EF866303E8B65",
    "children" : [ 
        {
            "_id" : ObjectId("58daf84977733645eaa9b450"),
            "name" : "Mert",
            "age" : 5,
            "additionalinformation" : "ilk cocuk",
            "creationtime" : ISODate("2017-03-28T23:56:56.952Z"),
            "userid" : ObjectId("58daf84877733645eaa9b44f"),
            "gender" : null
        }, 
        {
            "_id" : ObjectId("58daf84977733645eaa9b451"),
            "name" : "Sencer",
            "age" : 7,
            "additionalinformation" : "ikinci cocuk",
            "creationtime" : ISODate("2017-03-28T23:56:56.952Z"),
            "userid" : ObjectId("58daf84877733645eaa9b44f"),
            "gender" : null
        }
    ]
}

工作

{
    "_id" : ObjectId("58db0a2d77733645eaa9b453"),
    "creationtime" : ISODate("2017-03-29T01:13:17.509Z"),
    "startingtime" : ISODate("2017-04-03T13:00:00.000Z"),
    "endingtime" : ISODate("2017-04-03T17:00:00.000Z"),
    "children" : [ 
        ObjectId("58daf84977733645eaa9b450"), 
        ObjectId("58daf84977733645eaa9b451")
    ],
    "creatorparent" : ObjectId("58daf84877733645eaa9b44f"),
    "applicants" : []
}

【问题讨论】:

    标签: mongodb go


    【解决方案1】:

    如果我理解正确的话。使用 MongoDB 3.4 的 $addFields 和 $lookup 聚合步骤可以实现类似的解决方案。

    Mongo 聚合:

    [
        {
            $addFields: { 
                "job":"$$ROOT"
            }
        },
        {
            $unwind: {
                path : "$children"
            }
        },
        {
            $lookup: {
                "from" : "users",
                "localField" : "creatorParent",
                "foreignField" : "_id",
                "as" : "creatorParent"
            }
        },
        {
            $lookup: {
                "from" : "users",
                "localField" : "children",
                "foreignField" : "_id",
                "as" : "children"
            }
        },
        {
            $group: {
                "_id": "$_id",
                "job": { "$first": "$job" },
                "creatorParent" : { "$first" : "$creatorParent" },
                "children": { "$addToSet": {  $arrayElemAt: [ "$children", 0 ]  } }
            }
        }
    ]
    

    输出将如下所示:

    { "_id" : ObjectId("58da9cb6340c630315348114"), 
    "job" : {
        "_id" : ObjectId("58da9cb6340c630315348114"), 
        "name" : "Developer", 
        "creatorParent" : ObjectId("58da9c79340c630315348113"), 
        "children" : [
            ObjectId("58da9c6d340c630315348112"), 
            ObjectId("58da9c5f340c630315348111")
        ], 
        "hourly_rate" : 12.0, 
        "additional_information" : "other infos"
    }, 
    "creatorParent" : [
        {
            "_id" : ObjectId("58da9c79340c630315348113"), 
            "name" : "The Boss", 
            "age" : 40.0
        }
    ], 
    "children" : [
        {
            "_id" : ObjectId("58da9c5f340c630315348111"), 
            "name" : "James", 
            "age" : 28.0
        }, 
        {
            "_id" : ObjectId("58da9c6d340c630315348112"), 
            "name" : "Andrew", 
            "age" : 26.0
        }
    ]}
    

    更新:

    如果你用这个替换最后一个$group 阶段:

    {
        "_id": "$_id",
        "name": { "$first": "$name" },
        "jobstatus": { "$first": "$jobstatus" },
        "hourlyrate": { "$first":"$hourlyrate" },
        "creatorparent" : { "$first" : "$creatorparent" },
        "children": { "$addToSet": {  $arrayElemAt: [ "$children", 0 ]  } }
    }
    

    然后你就可以实现你想要的,但是在这个$group阶段你必须用$first表达式一个一个地指定工作的每个领域。

    【讨论】:

    • 你好,谢谢你的回答,但我看起来有些不同,当我从数据库而不是创建者父母的 ID 中检索工作时,我想获得如下所列的 creatorParent 的详细信息。就像 SQL 上的左连接
    • 我已经尝试过您的代码,但我无法检索孩子的详细信息
    • children 字段仍然返回空数组 :(
    • 我在另一个帖子里回复了:stackoverflow.com/questions/43082266/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2020-08-07
    • 2020-12-29
    • 2016-11-14
    • 1970-01-01
    • 2022-07-09
    相关资源
    最近更新 更多