【问题标题】:How can I update a Mongoose subdocument in an instance method?如何在实例方法中更新 Mongoose 子文档?
【发布时间】:2015-05-02 13:20:25
【问题描述】:

我有一个 Mongoose 文档,其中包含这样的子文档数组:

var RegionSchema = new Schema({
  "metadata": {
    "regionType": String,
    "name": String,
    "children": [{
      "name": String,
      "childType": String,
      "id": Schema.ObjectId
    }],
    "parent": Schema.ObjectId
  },

  "data": [DataContainer]
});

DataContainer架构中,我想做一个可以更新自身内部数据的实例方法。

为清楚起见,我希望能够查找Region,在data 数组中找到DataContainer 并调用类似dataCont.update() 的东西,其中@987654327 @instance 可以做一个this.save()。这可能吗?

在做

this.save(function(err, saved) {
  console.log(saved)
  callback(err, saved);
});

DataContainer 实例方法中打印出undefined。回调被命中了。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    如果data 属性是一个子文档,您可以轻松地使用populate 并对其进行更新:

    Region.findOne({ _id: regionId })
      .populate('data')
      .exec(function (err, region) {
        // ...
    
        var data = region.data, // data container
            dataItem = data[0];
    
        dataItem.property = 'some value';
        dataItem.save(function (err, item) {
          //...
        });
    
        // or
        dataItem.update({ $set: { property: 'some value' }}, function (err, item) {
          // ...
        });
    
      });
    

    【讨论】:

    • 它实际上是一个子文档数组。我想专门制作一个实例方法,因为我有某种组合两个DataContainers 的方法。从实例方法中保存它们是不可能的吗?如果是这样,我想我可以重新排列一下我的代码。
    • 你说的combining two DataContainers是什么意思?如果您的模式正常配置,则 istance 方法应该可以工作。这里有一些例子:mongoosejs.com/docs/populate.html
    • 我的意思是我有几个字段,这个实例方法将另一个实例的字段添加到它自己的字段中并尝试保存更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2021-12-23
    相关资源
    最近更新 更多