Mongodb数组$ push和$ pull

时间:2015-12-11 07:04:49

标签: mongodb

我希望从数组中提取一些值并同时尝试更新它。

    userSchema.statics.experience = function (id,xper,delet,callback) {
    var update = {
      $pull:{
        'profile.experience' : delet
      },

        $push: {
          'profile.experience': xper
        }
  };
  this.findByIdAndUpdate(id,update,{ 'new': true},function(err,doc) {
    if (err) {
      callback(err);
    } else if(doc){
      callback(null,doc);
    }
  });
};

我收到的错误如MongoError: exception: Cannot update 'profile.experience' and 'profile.experience' at the same time

2 个答案:

答案 0 :(得分:8)

我找到了这个解释:

  

问题是MongoDB不允许对其进行多项操作   同一更新调用中的相同属性。这意味着两者   操作必须在两个单独的原子操作中进行。

你可以阅读那些帖子:

Pull and addtoset at the same time with mongo

multiple mongo update operator in a single statement?

答案 1 :(得分:2)

如果需要将一个数组值替换为另一个,可以使用 arrayFilters 进行更新。

(至少在mongo 4.2.1中存在)。

db.your_collection.update(
    { "_id": ObjectId("your_24_byte_length_id") },
    { "$set": { "profile.experience.$[elem]": "new_value" } },
    { "arrayFilters": [ { "elem": { "$eq": "old_value" } } ], "multi": true }
) 

这会将所有“旧值”数组元素替换为“新值”。