替换mongodb文档而不附加属性

时间:2017-03-28 21:37:03

标签: node.js mongodb express mongoose

我想我在这里有一个奇怪的。

我在express中使用mongoose来更新集合中的文档。该模型如下所示:

var customers = new Schema({
companyName: String,
addressLine1: String,
addressLine2: String,
city: String,
province: String,
postal: String,
businessPhone: String,
contacts: [{
    firstName: String,
    lastName: String,
    title: String,
    phone: String,
    email: String
}],
custCode: Number,
rep: String
});

上面是一个新模型,因为旧模型看起来像这样:

var customers = new Schema({
companyName: String,
firstName: String,
lastName: String,
addressLine1: String,
addressLine2: String,
city: String,
province: String,
postal: String,
businessPhone: String,      
email: String
custCode: Number,
rep: String
});

不同之处在于我打破了“联系人”阵列,以便将来可以添加更多联系人。集合中的现有文档具有旧样式的模型,更新对象具有新模型。

当我运行以下代码时,文档最终会附加contacts数组,但也会保留firstName和lastName,email等,而不是按照新模型的规则丢失它。

var conditions = {custCode:req.body.customer.custCode}
, update = req.body.customer
, options = {upsert: false, new: true};

mongoose.model('customers').findOneAndUpdate(conditions, update, options, callback);
function callback (err, doc) {
    if(err) {
      console.log("Errors: " + err);
      res.sendStatus(500);
    } else {
      console.log("Customer Saved! Rows affected: ", doc);
      res.sendStatus(200); 
    };
  };

我应该使用不同的猫鼬功能吗?我应该使用$ unset吗?

我宁愿不对数据库进行两次调用(一次是删除匹配的集合,另一次是保存新模型。

提前非常感谢!

2 个答案:

答案 0 :(得分:2)

您可以使用$unset删除contacts数组和$set以添加新模型。

mongoose.model('customers').findOneAndUpdate(conditions, { $set:update, $unset: {'contacts': ''}}, options, callback);

答案 1 :(得分:1)

findOneAndUpdate使用新数据修改现有文档。

您提供的选项不会修改文档替换。

  • upsert会在当前不存在时影响新文档的创建。
  • new会影响函数返回的数据。更新前或后。

如果您拥有update变量中的完整数据集,则可以使用replaceOne

完全替换现有文档
mongoose.model('customers').replaceOne(conditions, update, options, callback);
function callback (err, doc) {
    if(err) {
      console.log("Errors: " + err);
      res.sendStatus(500);
    } else {
      console.log("Customer Saved! Rows affected: ", doc);
      res.sendStatus(200); 
    };
  };