更新子文档中的数据而不覆盖mongoose中的另一个字段

时间:2018-03-18 02:26:55

标签: node.js mongoose

数据库中的数据

fieldA : 'aaaaa',
fieldB : {
      en : 'aaaaaaaaaa',
      de : 'bbbbbbbbbb'
}

新数据

val = {
fieldA : 'aaaaa11',
fieldB : {
            en : 'aaaaa1111'
         }
}

我试过这段代码

Model.findOneAndUpdate({fieldA : val.fieldA},{ $set : val})

当我运行此命令时,'fieldB.de'丢失了。我想知道如何更新结果如下所示

fieldA : 'aaaaa11',
fieldB : {
  en : 'aaaaa1111',
  de : 'bbbbbbbbbb'
}

2 个答案:

答案 0 :(得分:0)

试试这个:

Model.findOneAndUpdate({fieldA : val.fieldA},{
  "$set": {
    "fieldA": val.fieldA,
    "fieldB.en": val.fieldB.en
  }
})

在您的解决方案中,您将文档completny与其他文件一起更新。要仅更新特定字段,必须在“$ set”对象

中指定此字段

答案 1 :(得分:0)

我通过先找到文档并手动编辑 de 对象来解决此问题。

/* Recursive function to update manually an object */
const update = (obj, newValues) => {
  Object.entries(newValues).forEach( ([key, value]) => {
    if(typeof value === 'object'){
      update(obj[key], value);
    } else {
      obj[key] = value;
    }
  });
}
/* Find document, update and save */
const infoToUpdate = {};
const doc = await Model.findOne({ field: valueToFind });
if (doc) {
  object.update(doc, infoToUpdate);
  doc.save();
}