我有一个猫鼬字段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/

10-09 20:22
查看更多