Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongoose findOneAndUpdate仅附加对象_Javascript_Node.js_Mongodb_Mongoose_Mongoose Schema - Fatal编程技术网

Javascript mongoose findOneAndUpdate仅附加对象

Javascript mongoose findOneAndUpdate仅附加对象,javascript,node.js,mongodb,mongoose,mongoose-schema,Javascript,Node.js,Mongodb,Mongoose,Mongoose Schema,我有一个目标如下 var exObj = { 'title' : 'name1'}; 其中一些具有对象的数据属性(不是我想通过名称引用的数组),看起来像 exObj = { title : 'name2', data : { prop1 : 'prop1', prop2 : 'prop2' } } 现在我想给数据添加另一个属性,有时数据属性会存在,有时不存在,但我想附加一个属性(addedProp)并保存它,这样我就可以得到这个属性

我有一个目标如下

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
    }
  });
您需要使用以嵌入对象中的特定字段为目标,根据提供的字段构建更新对象:

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

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

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

如果不存在,它将添加prop3;如果存在,它将更新prop3。我已经用update和findOneAndUpdate检查了本地数据库上的代码。您是否尝试过收集。findOneAndUpdate({“title”:“name2”},{“data”:data},{upsert:true})。exec(callback)?我找不到一种方法来对这些添加的属性添加一些值检查,您能检查我更新的问题吗?