Mongodb Aggregate:将一个集合的值替换为另一集合的匹配值 [英] Mongodb Aggregate : replace value of one collection with matching value of other collection

查看:447
本文介绍了Mongodb Aggregate:将一个集合的值替换为另一集合的匹配值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是MongoDB的新手,我有两个这样的集合:

I am new to MongoDB, I have two collections like this :

第一个收藏名称是

db.a.find()

db.a.find()

{
"_id": "1234",
"versions": [{
        "owner_id": ObjectId("100000"),
        "versions": 1,
        "type" : "info",
        "items" : ["item1","item3","item7"]
    },
    {
        "owner_id": ObjectId("100001"),
        "versions": 2,
        "type" : "bug",
        "OS": "Ubuntu",
        "Dependencies" : "Trim",
        "items" : ["item1","item7"]
    }
]}

第二个收藏集的名称为b

db.b.find()

db.b.find()

 {
    "_id": ObjectId("100000"),
    "email": "abc@xyz.com"
  } {
    "_id": ObjectId("100001"),
    "email": "bbc@xyz.com"
 }

预期输出为:

{
"_id": "1234",
"versions":[{

        "owner_id": "abc@xyz.com",
        "versions": 1,
        "type" : "info",
        "items" : ["item1","item3","item7"]
    },
    {
        "owner_id": "bbc@xyz.com",
        "versions": 2,
        "type" : "bug",
        "OS": "Ubuntu",
        "Dependencies" : "Trim",
        "items" : ["item1","item7"]
    }
] }

要求:版本的每个文档中的字段都不固定, 示例:版本[0] 具有4个键值对,版本[1] 具有6个键值对. 因此我正在寻找一个查询,该查询可以将 owner_id 替换为电子邮件,并在输出中保留所有其他文件.

Requirement: fields inside each document of versions are not fixed, Example : versions[0] have 4 key-value pair and versions[1] have 6 key-value pair. so I am looking a query which can replace owner_id with email keeping all other filed in output.

我尝试过:

db.a.aggregate(
    [
        {$unwind:"$versions"},
        {$lookup : {from : "b", "localField":"versions.owner_id", "foreignField":"_id", as :"out"}}, 
        {$project : {"_id":1, "versions.owner_id":{$arrayElemAt:["$out.email",0]}}},
        {$group:{_id:"$_id", versions : {$push : "$versions"}}}
    ]   
).pretty()

请帮助.

谢谢!

推荐答案

代替 $ addFields

示例:

db.a.aggregate([
    { $unwind: "$versions" },
    {
        $lookup: {
            from: "b",
            localField: "versions.owner_id",
            foreignField: "_id",
            as: "out"
        }
    }, 
    {
        $addFields: {
            "versions.owner_id": { $arrayElemAt: ["$out.email",0] }
        }
    },
    { $group: { _id: "$_id", versions: { $push: "$versions" } } }
]).pretty()

这篇关于Mongodb Aggregate:将一个集合的值替换为另一集合的匹配值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆