MongoDB параллельные обновления для коллекции - PullRequest
0 голосов
/ 03 сентября 2018

Я новичок в MongoDB, у меня есть этот вопрос, скажем, у меня есть коллекция продуктов, `

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

`

Я хотел бы обновить эту коллекцию продукта одновременно с двумя операторами обновления в разных потоках, 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 голосов
/ 03 сентября 2018

Обновления отдельного документа в MongoDB: атомарный , но, поскольку вы не используете точечную нотацию в своем обновлении «Поток 1», если это обновление произойдет вторым, весь поддокумент details будет перезаписан до { model: "14Q3"}.

Однако, если вы измените это обновление на использование точечной нотации, порядок обновления не имеет значения:

db.products.update(
   { _id: 100 },
   { $set:
      {
        quantity: 500,
        "details.model": "14Q3"
      }
   }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...