mongoose findOneAndUpdate只追加对象

mongoose findOneAndUpdate appends objects only

本文关键字:对象 追加 findOneAndUpdate mongoose      更新时间:2023-09-26

我有一个像这样的对象;

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

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

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

现在我想给data添加另一个属性,有时data属性会存在,有时不存在,但我想添加一个属性(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(),但后来我没有一个合适的猫鼬对象来做。

进一步说明;这对简单的属性是有效的(而且效果很好)我知道这些属性是固定的;有一些值我希望添加,我需要检查他们是否有一个值的属性添加属性

就像这样;

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

您的问题首先看起来令人生畏,但解决方案很简单,您不需要使用$或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检查了本地db上的代码

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

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) {