簡體   English   中英

mongoose findOneAndUpdate僅附加對象

[英]mongoose findOneAndUpdate appends objects only

我有一個像下面這樣的對象;

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(),但后來我沒有一個正確的貓鼬對象來執行.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
    }
  });

你的問題首先看起來令人生畏,但解決方案非常簡單, 你不需要使用$或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檢查了本地數據庫上的代碼

您需要使用點表示法來定位嵌入對象中的特定字段,並根據提供的字段構建更新對象:

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

暫無
暫無

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

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