mongoose findOneAndUpdate 仅追加对象

4
我有一个像下面这样的对象;
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(),但是那样我就没有一个适当的 mongoose 对象来执行 .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) 吗? - chridam
2个回答

3

您的问题似乎很困难,但解决方案非常简单,您不需要使用$或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检查了代码。


0

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

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

我看不到在这些添加的属性周围添加一些值检查的方法,请您检查一下我的更新问题,好吗? - dhj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接