Mongoose.js:如何实现创建或更新?

Posted

技术标签:

【中文标题】Mongoose.js:如何实现创建或更新?【英文标题】:Mongoose.js: how to implement create or update? 【发布时间】:2012-10-31 12:30:01 【问题描述】:

我有一个请求,其中正文包含数据和_id

如果存在带有 _id 的记录并且将创建一个记录,那么实现代码更新的更好方法是什么?我的代码:

var obj = req.body;
Model.findById(obj._id, function(err, data)
    if (!data)
        var model = new Model(obj)
        model.save(function(err, data)
            res.send(method: 'create', error: err, data: data)
        )
     else 
        Model.findByIdAndUpdate(obj._id, obj, function()
            res.send(method: 'update', error: err, data: data)
        )
    

我只是在想也许有更好的方法。

【问题讨论】:

【参考方案1】:

你可以用一个upsert做到这一点:

var obj = req.body;
var id = obj._id;
delete obj._id;
if (id) 
    Model.update(_id: id, obj, upsert: true, function (err) ...);

需要注意的是,您的模型的默认值和中间件(如果有)将不会被应用。

Mongoose 4.x 更新

如果 upsert 创建了一个新文档,您现在可以使用 setDefaultOnInsert 选项来应用默认值。

Model.update(_id: id, obj, upsert: true, setDefaultsOnInsert: true, cb);

【讨论】:

问题是“obj”包含_id,如果要更新,我需要在更新之前将其删除,否则会出现“Mod on _id not allowed”错误 @WHITECOLOR 好点。更新了代码以删除 update 之前的代码。 有问题。我希望新创建的(如果它不存在)项目的 _id 等于 obj._id,如果在创建操作之前从 obj 中删除 _id,mongo 将创建新的 _id。 @WHITECOLOR 当我尝试这个时,新创建的项目确实得到了一个 _id 等于 obj._id 的值,该值保存在查询选择器中使用的 id 值中。当需要创建一个新对象时,update 会结合这两个对象。 Here's a link to the Mongoose Model update method, which lists the upset option

以上是关于Mongoose.js:如何实现创建或更新?的主要内容,如果未能解决你的问题,请参考以下文章

mongoose.js 中带有查询生成器的 OR 运算符

mongoose.js 中带有查询生成器的 OR 运算符

Node.js:如何在 mongoose.js 中执行 count 命令?

Mongoose.js:嵌套属性的原子更新?

Mongoose.js:删除集合或数据库

Mongoose.js:删除集合或数据库