我是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是否支持单个文档中的这种原子行为?
答案 0 :(得分:1)
MongoDB中的单个文档更新为atomic,但是由于您未在“线程1”更新中使用点符号,因此,如果该更新第二次发生,则整个details
子文档将被覆盖到{ model: "14Q3"}
。
但是,如果您将该更新更改为使用点符号,则更新顺序无关紧要:
db.products.update(
{ _id: 100 },
{ $set:
{
quantity: 500,
"details.model": "14Q3"
}
}
)