使用mongoose的findOne/save保存对象无法工作

4

我的模型是:

GigSchema = new Schema({
  lastUpdate: {
    type: Date,
    "default": null
  },
  type: {
    type: String,
    "default": null,
    "enum": [null, 'mvp', 'code-review', 'extension', 'existent-code-review', 'internal', 'design']
  },
  meta: {
    type: Object,
    "default": {
      chats: 0,
      phoneCalls: 0,
      responseTime: null
    }
  },
  engaged: {
    type: Date,
    "default": null
  }
});

当我执行以下操作时:

Gig.findOne({
  _id: data.gig
}).populate(populate).exec(function(err, gig) {
  gig.meta.chats += 1;
  return gig.save(function(err) {
    return console.log(err);
  });
});

我正尝试更新“meta”字段,但它实际上没有保存,也没有错误。我做错了什么?
3个回答

3

populate应该用于获取其他集合中文档的引用。请参见http://mongoosejs.com/docs/populate.html

如果您只想更新文档中的字段,可以执行以下操作:

Gig.findOne({_id: data.gig},  function (err, gig) {
    gig.meta.chats += 1;
    gig.save(function(err){
        console.log(err);
    })
})

或者您也可以使用Model.findOneAndUpdate

来进行操作。

Gig.findOneAndUpdate({_id: data.gig}, { $inc: { meta.chats : 1 }}, {new: true}, function(err, doc){
    if (err){
        console.log(err); 
    } 
})

@Shamoon 我相信有一种方法可以使用 populate 使其正常工作,但是最好利用mongoose已经提供的方法,因为它们非常优化。 populate 的目的是允许在 MongoDB 中进行 join 操作(就像在 sql 中一样)。 - Kairat
@Shamoon 我更新了我的答案。你也可以使用 Model.findOneAndUpdate - Kairat

2
因为我正在修改对象的属性,所以答案与使用 gig.markModified('meta') 有关。

2

使用这个结构... 如果您在错误捕获方面遇到问题,请使用 update 方法进行更新,而不是保存。

Gig.findOne({
  _id: data.gig
}, function(err, gig){
    if(err){
        throw err;
    }else if(gig){
      Gig.update({_id: data.gig},{
         meta.chats : gig.meta.chats + 1;
     },
    {
      runValidators: true
    },
    function(err){
       if(err) throw err;
    }
    );

希望这能对您有所帮助。我等待结果,希望一切顺利。

});


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接