如何使用参考字段值更新文档字段



实际上有2个文档:历史和子公司,但我忘记了将历史添加到子公司名称中。

历史文档:

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

子公司文件

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

现在,我需要更新历史文档,从子提供的文档

中添加一个"子公司名"字段,并带有"子公司"字段。

这是我的第一个剥夺:

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"
    }
}

然后,我有2个问题:

  1. 如何仅将平面文本值设置为子公司字段?R:添加.NAME到项目获取平面文本

  2. 如何设置当前文档的.findone((" id"参数,而是objectid('硬代码'(?R:使用foreach光标

  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);
    }
    })

尝试以下:

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

最新更新