如何在MongoDB shell中更新数组对象值

如何在MongoDB shell中更新数组对象值,mongodb,mongodb-query,Mongodb,Mongodb Query,我想更新嵌套数组对象中包含ObjectId的所有MongoDB文档 我的医生是: { "_id" : ObjectId("5a61a6bdae8bdc26685f8c27"), "variant_count" : 1, "salts" : [ { "name" : "Cetirizine", "classification" : "HD", "dosage" : 0.0, "is_cold_storag

我想更新嵌套数组对象中包含ObjectId的所有MongoDB文档

我的医生是:

{
  "_id" : ObjectId("5a61a6bdae8bdc26685f8c27"), 
  "variant_count" : 1, 
  "salts" : [
    {
        "name" : "Cetirizine", 
        "classification" : "HD", 
        "dosage" : 0.0, 
        "is_cold_storage" : false, 
        "id" : ObjectId("5a61a292ae8bdc26685f2a91")
    }]
  "drug_category" : "DRUGS", 
  "name" : "Adicold Tab", 

}
我想将所有salts.id更新为字符串

例如

{
  "_id" : ObjectId("5a61a6bdae8bdc26685f8c27"), 
  "variant_count" : 1, 
  "salts" : [
    {
        "name" : "Cetirizine", 
        "classification" : "HD", 
        "dosage" : 0.0, 
        "is_cold_storage" : false, 
        "id" : "5a61a292ae8bdc26685f2a91"
    }]
  "drug_category" : "DRUGS", 
  "name" : "Adicold Tab", 
}
这是我的作品:

db.product.find({"salts.id" : {$type : 7}}).forEach(
    function(doc) {
    var salts = doc.salts;
    var newSalts = [];
    if (Array.isArray(salts) && salts.length > 0) {
      for (i = 0; i < salts.length; i++) { 
        salt = salts[i];
        if (salt['id'] != null && typeof salt['id'] == 'object') {
            salt['id'] = salt['id'].str
            newSalts.push(salt)
        } else {
          newSalts.push(salt)
        }
      } 
      db.product.update( { _id: doc._id }, { $set: { salts: newSalts } } 
     );
      i = i + 1;
    }
  }
);
db.product.find({“salts.id”:{$type:7}).forEach(
功能(doc){
var盐=doc盐;
var newSalts=[];
if(数组isArray(salts)和salts.length>0){
对于(i=0;i
您可以像更改任何其他字段类型一样更改它。下面的链接将为您提供解决方案。只需将字段名用作salts.id。谢谢@初学者它帮助我解决了我的问题,也发布了同样的更新查询,请查看,如果需要任何其他优化,请让我知道如果这对你有效,请继续。我认为不需要任何优化,因为此更新只运行一次。它不是一个循环函数。但是,是的,如果您计划在生产数据库中运行它,并且它不是一个强制字段,我建议您首先运行一些测试,特别是使用“集合中没有这样的字段”、“字段分配为null而不是未定义”等变体。真的有理由更新它吗?因为大多数驱动程序都提供了对象ID的字符串表示,对于.net驱动程序来说,它只是变量上的注释。啊,好的。我建议你做些测试。另外,不要认为你需要其他部分。如果id存在,请将其更改为string并调用update。祝你好运
**This code is working fine for me.**

db.collectionName.find({}).forEach(function(item){
                    if (item) {
                        item.salts.forEach(function(data){ 
                            if(data){
                                data.id = data.id.valueOf();
                            }
                        })
                        db.collectionName.save(item);
                    }
                })