我想我在这里有一个奇怪的。
我在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吗?
我宁愿不对数据库进行两次调用(一次是删除匹配的集合,另一次是保存新模型。
提前非常感谢!
答案 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);
};
};