[英]How to update embedded document in array in mongoose where operation should be atomic, should update on the latest one and return updated document?
目前正在使用 mongoose 開發 node.js 和 MongoDB。
//Document in mongoDB
{
name: 'first',
_id: '1000'
phases: [{
_id: 1,
phaseName: 'phase1',
stories: [{
_id: s1,
sname: 'sfirst'
},
{
_id: s2,
sname: 'ssecond'
},
{
_id: s3,
sname: 'sthird'
}
],
},
{
_id: 2,
phaseName: 'phase2',
stories: [{
_id: s1,
sname: 'sfirst'
},
{
_id: s2,
sname: 'ssecond'
},
{
_id: s3,
sname: 'sthird'
}
],
}
],
}
我所擁有的是
主要要求是這個操作應該是
我可以使用 findOne() 和 save() 執行此操作嗎
Model.findOne({
id
}, (err, plan) => {
if (!err) {
//REMOVE THE STORY FROM PHASE
const phase = plan.phases.find((phase) => phase._id === delPhaseID);
phase.stories = phase.stories.filter((story) => story._id !== delStoryId);
//ADD STORY IN STORIES
const addPhase = plan.phases.find((phase) => phase._id === addPhaseID);
addPhase.stories.splice(pos, 0, story);
//SAVE PLAN
plan.save((err, doc) => {
if(!err)
console.log(doc) // UPDATED DOCUMENT
});
}
})
但是這個操作不是原子操作,如下圖來自masteringjs 。 我們如何解決這個問題
你可以嘗試findOneAndUpdate()
和arrayFilters ,
p1
id 的故事中移除的$pull
是s1
$push
到p2
特定位置使用$positionnew: true
返回更新的文檔Model.findOneAndUpdate(
{ _id: "1000" },
{
$pull: {
"phases.$[p1].stories": {
_id: "s1"
}
},
$push: {
"phases.$[p2].stories": {
$each: [{
_id: "s4",
sname: "fourth"
}],
$position: 1
}
}
},
{
arrayFilters: [
{ "p1._id": 1 },
{ "p2._id": 2 }
],
new: true
}
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.