我有一个猫鼬字段X。
我查询它并更新其数据。
在一定条件下,必须对其进行复制,并且仅将新副本与新数据一起保存到数据库中(原始副本必须与查询之前保持相同)。
但是以某种方式,猫鼬会保存原始文档,即使我没有使用.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();
}
有任何想法吗?
最佳答案
当您使用现有的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操作符以处理异常,或使用类似
tryjson
的模块。关于node.js - 如何*不*保存 Mongoose 文档?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46339089/