在mongoose中更新嵌套对象

cod*_*ode 18 mongoose mongodb node.js

我已经在嵌套对象上搜索了很多问题,但我找到了与array [s]相关的所有问题.

我正在寻找在mongoose中更新简单的嵌套对象.

从这里http://mongoosejs.com/docs/guide.html

there is an example schema :
var blogSchema = new Schema({
  title:  String,
  author: String,
  body:   String,
  comments: [{ body: String, date: Date }],
  date: { type: Date, default: Date.now },
  hidden: Boolean,
  meta: {
    votes: Number,
    favs:  Number
  }
});
Run Code Online (Sandbox Code Playgroud)

一旦创建了文档,

我怎样才能在以后更改个人号码?

我找不到相同的文件.

这就是我做的:

blog.findById(entityId, function(err, mainDoc){
      if(err || !mainDoc) return next(err || 'Document not found');
      var subDoc = mainDoc['meta'];
      if(subDoc){
        subDoc = _.extend(subDoc, { favs : 56 }); //_ lib already available
        console.log(mainDoc.get('meta')); //Prints the updated result with favs = 56  OK
        mainDoc.save(function(err, doc){
           console.log(doc.get('meta')); // prints the updated results with favs = 56 OK
        });
      } else next('Not found');
    });
Run Code Online (Sandbox Code Playgroud)

一切正常,所有控制台都能提供所需的结果.

但是,当我切换到mongoose控制台并查询文档时,我没有得到更新的结果.

我知道可以有其他方法来实现相同的目标,但我只是在寻找我在这个特定代码中做错的方法.

为什么控制台在保存文档后会从数据库中提供无与伦比的数据?

启用mongoose调试选项后,我发现在查询中没有要更新的数据.查询以空白$ set触发.{$ set:{}}

Ger*_*osi 27

如果您只想更改其值favs,可以使用更简单的查询:

blog.findByIdAndUpdate(entityId, {$set: {'meta.favs': 56}}, function(err, doc) {
    console.log(doc);
});
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是更好的答案.但我实际上是想在上面的代码中找到我做错了什么. (3认同)