MongoDb / Mongoskin - CLEANLY更新整个文档,无需指定属性

时间:2015-04-01 21:22:37

标签: mongodb mongoskin

我见过的MongoDb& amp;的所有例子用于更新的Mongoskin,正在更新各个属性,如下所示:

    // this works when I specify the properties
    db.collection('User').update({_id: mongoskin.helper.toObjectID(user._id)}, 
     {'$set':{displayName:user.displayName}}, function(err, result) {
        if (err) throw err;
        if (result){ res.send(result)}
    });

但是,如果我想要更新整个对象/文档,那该怎么办:

// this does not appear to work 
 db.collection('User').update({_id: mongoskin.helper.toObjectID(user._id)}, {'$set':user},
    function(err, result){
    // do something
 }

返回错误:

// It appears Mongo does not like the _id as part of the update

    MongoError: After applying the update to the document {_id: ObjectId('.....

要解决这个问题,我必须做的就是让事情有效:

  function (req, res) {
    var userId = req.body.user._id
    var user = req.body.user;
    delete user._id;

    db.collection('User').update({_id: mongoskin.helper.toObjectID(userId)}, 
       {'$set':user}, function(err, result) {   
        if (err) throw err;
        console.log('result: ' + result)
        if (result){ res.send(result)}
    });
})

这是一种更优雅的方式来更新整个文档,而不是通过以下方式进行黑客攻击:

   delete user._id

1 个答案:

答案 0 :(得分:0)

如果要更新整个对象,则不需要$ set。我不知道mongoskin,但在shell中你会做类似的事情:

var userObj = {
   _id: <something>
   ...
};
db.user.update({_id: user._id}, user);

我认为可以通过以下方式在你的mongoskin中翻译。

db.collection('User').update({_id: user._id}, user, function(){...})

但这是问题所在。 您无法更新Mongo中元素的_id 。这就是你的错误告诉你的。因此,您可以从_id对象中删除user并单独进行。按此单独的_id进行搜索,并使用user对象进行更新而不使用_id