【发布时间】:2020-12-19 05:51:31
【问题描述】:
目前正在使用 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'
}
],
}
],
}
我只有
- id=1000(在 mongodb 中查找此文档)
- phaseId=1 和 remstoryId=s2(即从 id 为 1 的阶段的故事中删除 s2)
- phaseId=2,storyId={ _id: s4, sname: Fourth},位置:1(在第 2 阶段的索引 1 处添加故事中的故事)
主要要求是这个操作应该是
- 原子
- 其他用户在执行上述操作时不能对同一文档执行操作。我的意思是锁定此文档。
我们可以使用 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。我们该如何解决这个问题
【问题讨论】:
标签: javascript node.js mongodb mongoose