我有一个猫鼬场X. 我查询并更新其数据。
在某种情况下,必须复制它,并且只有新副本必须使用新数据保存到数据库中(原始文件必须保持与查询之前相同)。
但不知何故,mongoose保存了原始文档,即使我没有用.save()命令询问它。
X.findById(req.params.id)
.exec(function (err, original) {
original.name = 'newName';
if(condition){
var copy = new X(original);
copy.isNew = true;
copy._id = mongoose.Types.ObjectId()
X.collection.insert(copy, callback(){})
}else{
original.save();
}
任何想法?
答案 0 :(得分:0)
当你运行一个以现有Mongoose对象为参数的构造函数时,Mongoose可能会做一些魔术。
首先,我首先尝试运行没有_id的构造函数,而不是稍后更改它。 lodash示例:
const copy = new X(_.omit(original, ['_id']));
第二,我尝试明确地只传递所需的字段:
const { field1, field3, field3 } = original;
const copy = new X({ field1, field2, field3 });
或者使用lodash:
const copy = new X(_.pick(original, ['field1', 'field2', 'field3']));
如果所有其他方法都失败了,我会尝试将其序列化并反序列化为JSON,以确保所有魔法消失:
const { field1, field3, field3 } = JSON.parse(JSON.stringify(original));
const copy = new X({ field1, field2, field3 });
或:
const copy = new X(JSON.parse(JSON.stringify(_.pick(original, ['f1', 'f2'])));
确保在try / catch块中运行JSON opertaions来处理异常,或使用像tryjson
这样的模块。