MongoDB对集合的并行更新

时间:2018-09-03 17:14:13

标签: mongodb mongodb-query

我是MongoDB的新手,有这个问题,说我有一个产品系列,`

{
  _id: 100,
  sku: "abc123",
  quantity: 250,
  instock: true,
  reorder: false,
  details: { model: "14Q2", make: "xyz" },
  tags: [ "apparel", "clothing" ],
  ratings: [ { by: "ijk", rating: 4 } ]
}

`

我想同时在不同线程中的两个update语句Thread1,`

上同时更新此产品集。
db.products.update(
   { _id: 100 },
   { $set:
      {
        quantity: 500,
        details: { model: "14Q3"}
      }
   }
)

Thread 2,

db.products.update(
   { _id: 100 },
   { $set: { "details.make": "zzz" } }
)

`

由于两个线程在同一个文档中同时发生,所以只想知道与输出发生的顺序无关{ "_id" : 100, "sku" : "abc123", "quantity" : 500, "instock" : true, "reorder" : false, "details" : { "model" : "14Q3", "make" : "zzz" }, "tags" : [ "apparel", "clothing" ], "ratings" : [ { "by" : "ijk", "rating" : 4 } ] } Mongo是否支持单个文档中的这种原子行为?

1 个答案:

答案 0 :(得分:1)

MongoDB中的单个文档更新为atomic,但是由于您未在“线程1”更新中使用点符号,因此,如果该更新第二次发生,则整个details子文档将被覆盖到{ model: "14Q3"}

但是,如果您将该更新更改为使用点符号,则更新顺序无关紧要:

db.products.update(
   { _id: 100 },
   { $set:
      {
        quantity: 500,
        "details.model": "14Q3"
      }
   }
)