【问题标题】:How to *not* save a mongoose document?如何*不*保存猫鼬文档?
【发布时间】:2017-09-21 18:51:50
【问题描述】:

我有一个猫鼬字段 X。 我查询它并更新它的数据。

在某种情况下,它必须被复制,并且只有新副本必须与新数据一起保存到数据库中(原始必须保持与查询前相同)。

但不知何故,即使我没有使用 .save() 命令,mongoose 也会保存原始文档。

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();

        }

有什么想法吗?

【问题讨论】:

  • 请显示您的架构。
  • condition 的可能值是多少?
  • x 值中的一些字符串。他们没有被感动

标签: node.js mongodb mongoose


【解决方案1】:

当您使用现有的 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 这样的模块。

【讨论】:

  • 您好,谢谢,我认为这不是问题 - 问题是 mongoose 将原始对象保存到数据库中,而它没有 save() 命令。我尝试了您的所有建议,但问题仍然存在
猜你喜欢
  • 2017-12-05
  • 1970-01-01
  • 2016-06-17
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 2016-01-24
  • 2018-01-22
相关资源
最近更新 更多