簡體   English   中英

貓鼬findOneAndUpdate刪除嵌套的變量

[英]mongoose findOneAndUpdate deletes nested vars

在我的express / mongoose代碼中,當我更新嵌套var時,它會刪除我未更新的對象中的任何其他嵌套vars嗎?

我的架構:

var MySchema = new Schema({
  active: { type: Boolean, required: true, default: true },
  myvar: {
    useDefault: { type: Boolean, required: true },
    custom: { type: String },
    default: { type: String }
  }
});

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

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值時,記錄最終如下所示:

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

誰能建議如何僅更新目標變量並保留其他變量?

答案是將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM