【问题标题】:Mongodb Update: I want to $inc {field: -1} but the result is {field: -2} (ie. decrementing 1 is resulting in decrementing 2)Mongodb 更新:我想 $inc {field: -1} 但结果是 {field: -2} (即递减 1 导致递减 2)
【发布时间】:2020-12-16 01:53:03
【问题描述】:

我正在尝试使用循环更新多个文档,并将每个阶段中的“周”字段减一 (1)。看起来很简单,代码如下:

//Go through masterPhaseArray and decrement a week for each phase
for(let i=0; i<res.locals.masterPhaseArray.length; i++){
    
    console.log("doubles? "+res.locals.masterPhaseArray[i]._id)
    
    await Phases.findByIdAndUpdate({_id: res.locals.masterPhaseArray[i]._id}, {$inc: {weeks: -1}}, (err, doc) => {
         console.log("finished")
    })
}

问题是,实际上是递减 2。

当我尝试反转它以增加 +1 时,它开始增加 +2。

我以为我一定是在以某种方式进行双循环,所以我添加了一个 console.log,结果如下:

[0] Connection established to mongodb://localhost:12345/teamy
[0] doubles? 5e44cc20c74f8a444851d2c3
[0] finished

如您所见,_id 只传递了一次,但数据库中的结果显示:

Before  { weeks: 6 }
After   { weeks: 4 }

我重新访问了 $inc 的 MongoDB 文档,它非常简单。我用谷歌搜索了这个问题,也找不到类似的东西。欣赏任何新观点。

【问题讨论】:

  • 发布后,我尝试删除“async”和“await”,它解决了问题。但我不知道为什么?

标签: javascript mongodb decrement


【解决方案1】:

循环检查masterPhaseArray 对象(计数和顺序)。 似乎您在执行Phases.findByIdAndUpdate 时及时将重复项添加到数组中。

从异步块进程中清除,并在循环完成后执行您对Array 的更改。

【讨论】:

  • 我测试了多种方式,数组只包含(1)个对象。但似乎 async/await 以某种方式“持有”查询,并允许双增量?
  • @IsraelPeck async-await 等待您的请求完成。嗯...尝试创建数组的副本并使用“for of”。 const array = [ ...res.locals.masterPhaseArray ]; for(const item of array){ ...your logic }
猜你喜欢
  • 2020-12-05
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 2014-06-16
相关资源
最近更新 更多