【问题标题】:Updating nested object in mongoose在猫鼬中更新嵌套对象
【发布时间】:2014-07-13 00:45:05
【问题描述】:

我搜索了很多关于嵌套对象的问题,但我发现的都是与数组[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 调试选项后,我发现查询中没有要更新的数据。查询以空白 $set 触发。 { $set : {} }

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

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

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

    【讨论】:

    • 我知道这是更好的答案。但我实际上是想在上面的代码中找出我做错了什么。
    • 如果 'favs' 是一个变量。那么我怎样才能实现类似下面的东西呢? blog.findByIdAndUpdate(entityId, {$set: {'meta[favs]': 56}}, function(err, doc) { console.log(doc); });
    • @RajdeepGautam 如果键是可变的,那么你会像 var key = 'meta.' + 最爱;现在 blog.findByIdAndUpdate(entityId, {$set: {[key]: 56}}, function(err, doc) { console.log(doc); });我还编辑了答案,如果它得到同行的批准:)
    • 您可以执行类似`meta[${favs}]` 的操作,其中 favs 是一个变量
    【解决方案2】:

    希望我不会迟到,并且能够帮助别人。这也适用于深层嵌套对象。没有限制。

        const updateNestedObjectParser = (nestedUpdateObject) => {
        const final = {
    
        }
        Object.keys(nestedUpdateObject).forEach(k => {
            if (typeof nestedUpdateObject[k] === 'object' && !Array.isArray(nestedUpdateObject[k])) {
                const res = updateNestedObjectParser(nestedUpdateObject[k])
                Object.keys(res).forEach(a => {
                    final[`${k}.${a}`] = res[a]
                })
            }
            else
                final[k] = nestedUpdateObject[k]
        })
        return final
    }
    
        console.log(updateNestedObjectParser({
        a: {
            b: {
                c: 99
            },
            d: {
                i: {
                    l: 22
                }
            }
        },
        o: {
            a: 22,
            l: {
                i: "ad"
            }
        }
    }))
    

    【讨论】:

      【解决方案3】:

      问题是,一旦您获得了来自 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');
          }
      });
      

      【讨论】:

        猜你喜欢
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-10
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 2017-01-28
        相关资源
        最近更新 更多