【问题标题】:Saving object with mongoose findOne / save doesn't work使用 mongoose findOne / save 保存对象不起作用
【发布时间】:2016-06-17 02:04:18
【问题描述】:

我的模型是:

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 字段,但它实际上并没有保存,但也没有错误。我做错了什么?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    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 的目的是允许 joins 在 MongoDB 中(就像在 sql 中一样)。
    • @Shamoon 我更新了我的答案。您也可以使用Model.findOneAndUpdate
    【解决方案2】:

    使用这个结构...如果你想更新一些东西,而不是保存,你会遇到错误捕获问题并使用更新方法。

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

    });

    希望这对您有所帮助。我在等一个结果,觉得还可以。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多