如何*不*保存猫鼬文件?

时间:2017-09-21 08:32:27

标签: node.js mongodb mongoose

我有一个猫鼬场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();

        }

任何想法?

1 个答案:

答案 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这样的模块。