【问题标题】:mongoose findOneAndUpdate appends objects only猫鼬 findOneAndUpdate 仅附加对象
【发布时间】:2016-10-05 13:41:01
【问题描述】:

我有一个如下对象;

var exObj = { 'title' : 'name1'};

其中一些具有对象的数据属性(不是我想通过名称引用的数组)并且看起来像

  exObj = {
    title : 'name2',
    data : {
      prop1 : 'prop1',
      prop2 : 'prop2'
    }
  }

现在我想为数据添加另一个属性,有时数据属性会存在,有时不存在,但我想附加一个属性(addedProp)并保存它,所以我最终会得到这个;

 exObj = {
    title : 'name2',
    data : {
      prop1 : 'prop1',
      prop2 : 'prop2',
      addedProp : 'value'
    }
  }

当使用 findOneAndUpdate 时,我似乎只能传入一个然后附加的整个对象;我目前正在做类似的事情。

var data = {};
data.addedProp = value;

Collection.findOneAndUpdate({
  title: 'name2'
}, {
  data
}, {
  upsert: true
})
.exec(function(err) {
  if (err) {
    console.log(err);
  } else {
    console.log('Updated');
  }
});

但显然这会覆盖现有的数据对象;执行 findOneAndUpdate 并对对象进行更有意义的更改的正确方法是什么?我尝试转换为 toObject() 但我没有合适的猫鼬对象来执行 .save() 。

添加进一步说明;这适用于我知道设置的简单属性(并且效果很好); 我希望添加一些值,我需要在添加属性之前检查它们是否具有属性值

所以是这样的;

    Collection.findOneAndUpdate({
      field: val
      }, {
      if (tObj.title) {
        title = tObj.title;
      }

      if (tObj.date) {
        release_date = tObj.date;
      }

      if (tObj.name) {
        name = tObj.name;
      }
    }, { upsert: true
    })
    .exec(function(err) {
    if (err) {
     //handler
    } else {
    //handler
    }
  });

【问题讨论】:

  • 你试过Collection.findOneAndUpdate({ "title": "name2" }, { "data": data }, { upsert: true }).exec(callback)吗?

标签: javascript node.js mongodb mongoose mongoose-schema


【解决方案1】:

您的问题首先看起来令人生畏,但解决方案很简单,您不需要使用 $ 或 upsert,因为您没有使用任何数组,因此不需要位置运算符或 upsert。 你可以使用下面的代码。

Collection.findOneAndUpdate({
  title: 'name2'
},{
    $set:{"data.prop3":"new prop3"}
})
.exec(function(err) {
  if (err) {
    console.log(err);
  } else {
    console.log('Updated');
  }
});

如果不存在,它将添加prop3,如果存在,它将更新它。我已经用 update 和 findOneAndUpdate 检查了本地数据库上的代码

【讨论】:

    【解决方案2】:

    您需要使用dot notation 来定位嵌入对象中的特定字段,根据提供的字段构建您的更新对象:

    var update = {};
    if (tObj.title) {
        update.title = tObj.title;
    }
    if (tObj.data) {
        if (tObj.data.prop1) {
            update['data.prop1'] = tObj.data.prop1;
        }
        if (tObj.data.prop2) {
            update['data.prop2'] = tObj.data.prop2;
        }
        if (tObj.data.addedProp) {
            update['data.addedProp'] = tObj.data.addedProp;
        }
    }
    
    Collection.findOneAndUpdate({
      title: 'name2'
    }, {
      $set: update
    }, {
      upsert: true
    })
    .exec(function(err) {
    

    【讨论】:

    • 我看不到一种方法可以围绕这些添加的属性添加一些值检查,请您检查我更新的问题吗?
    猜你喜欢
    • 2014-07-24
    • 1970-01-01
    • 2021-09-25
    • 2017-10-05
    • 2018-07-15
    • 2020-11-13
    • 2013-06-19
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多