mongoose findOneAndUpdate删除嵌套的变量

时间:2016-06-20 23:21:24

标签: javascript node.js mongodb express mongoose

在我的express / mongoose代码中,当我更新嵌套的var时,它删除了我没有更新的对象中的任何其他嵌套变量?

我的架构:

var updateData = req.body;
MySchema.findOneAndUpdate({ active: true }, updateData, function(err, myschema) {
    if (err) throw err;
    if (!myschema) { response(403, { success:false, message: "myschema not updated." }, res); }
    // success
    response(200, { success:true, message: "myschema updated." }, res);
});

我的快速中间件更新功能:

{
    "myvar": {
        "useDefault": true,
        "custom": "some custom var",
        "default": "some value"
    }
}

记录最初看起来像这样:

{
    "myvar": {
        "useDefault": false
    }
}

当我提交更新以说明myvar.useDefault值时,记录最终会像这样:

Requests

任何人都可以建议如何只更新目标var并保留其他任何变量吗?

1 个答案:

答案 0 :(得分:0)

答案是将response.body对象转换为点表示法,并将该修改后的对象传递给mongoose findOneAndUpdate。感谢Gitter的@btkostner提供的答案和他的toDot功能。以下是相关的代码:

function(req, res) {
  // convert response to dot notation so objects retain other values
  var dotData = toDot(req.body, '.');
  MySchema.findOneAndUpdate({ active: true }, dotData, function(err, myschema) {
    ...
}

// author: @btcostner 
function toDot (obj, div, pre) {
  if (typeof obj !== 'object') {
    throw new Error('toDot requires a valid object');
  }
  if (pre != null) {
    pre = pre + div;
  } else {
    pre = '';
  }
  var iteration = {};
  Object.keys(obj).forEach(function(key) {
    if (_.isPlainObject(obj[key])) {
      Object.assign(iteration, _this.toDot(obj[key], div, pre + key));
    } else {
      iteration[pre + key] = obj[key];
    }
  });
  return iteration;
};

注意:我必须将toDot()函数转换为我的项目的ES5,这是原始的ES6版本:github.com/elementary/houston/blob/master/src/lib/helpers/dotNotation.js