[英]Mongoose findOneAndUpdate return only the newly $push document
[英]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.