在mongoose中更新嵌套对象

时间:2014-05-23 15:18:46

标签: node.js mongodb mongoose

我已经搜索了很多关于嵌套对象的问题,但是我找到了与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
  }
});

创建文档后,

我如何稍后更改个人号码?

我找不到相同的文件。

这就是我所做的:

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

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

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

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

为什么控制台在保存文档后会从数据库中提供不匹配的数据?

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

2 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:-1)

问题在于,除了将mongoose数据发送到客户端之外,你不能对它进行任何操作。

但是,有一种精益方法可以让你随后更新信息并随心所欲地做任何事情。

看起来像这样:

blog.findById(entityId).lean().exec(function (err, mainDoc) {
    if (err || !mainDoc) {
        return next(err || 'Document not found');
    }
    var subDoc = mainDoc.meta;
    if(subDoc){
        subDoc.favs = 56;
        blog.update({_id: entityId}, mainDoc, function(err, doc){
            console.log(doc.get('meta'));
        });
    } else {
        next('Not found');
    }
});