Скажем, у меня есть документ, как это:MongoDB upsert в поддокументе в массиве и вернуть обновленный поддокумент
{
"_id" : ObjectId(1234),
"name": "foo",
"bars": [
{ "name": "n1", "myBool": true },
{ "name": "n2", "myBool": false },
{ "name": "n3", "myBool": false }
]
}
я хотел бы найти name
(или весь поддокумент, это действительно не имеет значения) И измените myBool
на true
для первого вложенного документа в bars
, который в настоящее время false
для данного _id
в атомной операции. Например, с приведенными выше данными я хотел бы вернуть n2
И установить myBool
в true
для n2
в документе, которое имеет _id
, равное ObjectId(1234)
.
Как я могу это достичь?
Может ли быть изменен только вернуть поддокумент вместо всего документа? То есть Я хотел бы знать, какой поддокумент (имя) был изменен. – Johan
К сожалению, вы не можете сделать это в рамках атомного обновления. Вам нужно будет отфильтровать массив вручную, т. Е. Запустить два отдельных запроса 1. найти документ с помощью «_id»: 1234, «bars.myBool»: false } 'и затем запустить указанное выше обновление, которое возвращает измененный документ , Когда вы получите два документа, вы можете найти разницу в поддокусах массива 'bars'. – chridam
Ну, к сожалению, это не сработает в высококонкурентной среде, так как два или несколько потоков могут делать это одновременно. То есть Я не могу сначала прочитать, а затем сравнить результат, поскольку другой поток также мог обновить «myBool», а затем я не знаю, какой из них был изменен. – Johan