如何使用引用字段值更新文档字段?

时间:2017-06-26 14:36:30

标签: mongodb shell

实际上有两个文件:历史和子公司,但我忘了将附属名称添加到历史记录中。

历史文件:

{
    "_id" : ObjectId("59480f91ba4d070b882ff924"),
    "subsidiary" : ObjectId("5947fdf3ba4d070b882ff851"),
    "campaignTitle" : "Prueba Autoredeeem",
    "campaignId" : ObjectId("5948004fba4d070b882ff886"),
}

附属文件

{
    "_id" : ObjectId("5947fdf3ba4d070b882ff851"),
    "loginId" : 50174,
    "name" : "Sucursal Alpha",
}

现在我需要更新历史文档,添加" subsidiaryName"字段"子公司名称"来自子公司文件

的价值

这是我的第一个方法:

db.getCollection('couponredeemhistories')
   .updateMany({}, {$set: {subsidiaryName: 
                   db.getCollection('subsidiaries')
                   .findOne({"_id": ObjectId('5947fdf3ba4d070b882ff851')}, {_id: 0,name: 1})}})

但是,结果为我提供了一个辅助名称内的对象,而不是平面文本。

{
    "_id" : ObjectId("59480f91ba4d070b882ff924"),
    "subsidiary" : ObjectId("5947fdf3ba4d070b882ff851"),
    "campaignDescription" : "",
    "campaignTitle" : "Prueba Autoredeeem",
    "campaignId" : ObjectId("5948004fba4d070b882ff886"),
    "subsidiaryName" : {
        "name" : "Sucursal Alpha"
    }
}

然后,我有两个问题:

  1. 如何仅将平面文本值设置为subsidiaryNameName字段? R:将.name添加到项目以获取平面文本

  2. 如何设置.findOne()" id"当前文档的参数而不是ObjectId(' HARD CODE')? R:使用forEach Cursor迭代

  3. 重要限制:这适用于MongoDB Shell(MongoDB 3.4)

    谢谢,请支持我解决这个问题的任何语言问题。

    感谢@Astro:

    更新了答案
    db.getCollection('couponredeemhistories').find()
    .forEach(function(doc){
        if(doc.subsidiary !== undefined){
            doc.subsidiaryName = db.getCollection('subsidiaries').findOne({'_id': doc.subsidiary}, {_id: 0, name: 1}).name;
            db.getCollection('couponredeemhistories').save(doc);
        }
        })
    

1 个答案:

答案 0 :(得分:2)

试试这个:

db.getCollection('couponredeemhistories')
   .updateMany({}, {$set: {subsidiaryName: 
                   db.getCollection('subsidiaries')
                   .findOne({"_id": ObjectId('5947fdf3ba4d070b882ff851')}, {_id: 0,name: 1}).name}})