如何更新mongodb数组项没有竞争条件?

我有一个更新查询,certificate是受竞争条件,但我不知道为什么。

假设我在MongoDB中有一个stuff集合。 为了清晰起见,我使用了数字ID。

 stuff: { _id: 123 elements: [ { _id: 456, value: 'foo', }, { _id: 789, value: 'bar' }, ] } 

现在我想更新123下的element 456的值。

我认为这是好的(我使用mongoose,因此Stuff类):

 Stuff.update( { _id: 123, 'elements._id': 456 }, { $set: { 'elements.$': { _id: 456, value: 'foobar', something: 'else', } } } ) 

然而,这个查询似乎受竞争条件的影响。 我不能解释为什么,但我可以certificate,并行解雇这个请求会弄乱我的数据。 特别是如果我尝试同时更新元素456789

  • 是否有一个全面的原因,为什么这会造成麻烦?
  • 有没有办法来解决这个问题,所以它变得兼容certificate?

谢谢 !

PS:如果有任何相关性,我使用mongoose