#mongodb #mongodb-update
#mongodb #mongodb-обновление
Вопрос:
Я скомпилировал 2 запроса на обновление, обратившись к связанным ответам stackoverflow, однако, похоже, это не работает, запрос обновляет все элементы, в то время как ожидается обновление только элементов, соответствующих критериям.
Документ:
[
{
"_id": 259,
"members": [
{
"email": "test1@gmail.com",
"added_by": "javapedia.net",
"status": "pending"
},
{
"email": "test2@gmail.com",
"added_by": "javapedia.net",
"status": "pending"
},
{
"email": "test3@gmail.com",
"status": "pending"
}
]
}
]
Запрос 1: используя оператор сопоставления элементов, игровая площадка mongodb: https://mongoplayground.net/p/4cNgWJse86W
db.collection.update({
_id: 259,
"members": {
"$elemMatch": {
"email": {
"$in": [
"test3@gmail.com",
"test4@gmail.com"
]
}
}
}
},
{
"$set": {
"members.$[].status": "active"
}
},
{
"multi": true
})
Запрос 2: использование $in, игровая площадка mongodb: https://mongoplayground.net/p/tNu395B2RFx
db.collection.update({
_id: 259,
"members.email": {
"$in": [
"test3@gmail.com",
"test4@gmail.com"
]
}
},
{
"$set": {
"members.$[].status": "active"
}
},
{
"multi": true
})
Ожидаемый результат: только один элемент с test3@gmail.com статус должен быть обновлен до активного.
Фактический результат: оба запроса обновляют все записи.
Комментарии:
1. кроме того, включите образец документа,
$elemMatch
который мне кажется редким2. yyou мог бы сделать
"members.email":{$in..."
3. @turivishal, мне может потребоваться обновить несколько документов, в примере я только что рассмотрел только один документ.
Ответ №1:
db.collection.update({
_id: 259,
},
{
"$set": {
"members.$[el].status": "active"
}
},
{
arrayFilters: [
{
"el.email": {
$in: [
"test3@gmail.com",
"test4@gmail.com"
]
}
}
]
})
- При необходимости вы можете вернуть начальные условия, я просто сохраняю это вкратце (и для меня они не имеют смысла).
multi:true
не требуется для одного документа- Может быть, лучше семантически использовать
updateOne()