Обновление / удаление вложенного документа в коллекции MongoDB
Примечание: пожалуйста, используйте MongoDB shell для выполнения кодов.
предположим, у меня есть один студенческий документ, как показано ниже
{
"_id" : 4,
"grades" : [
{
"grade" : 80,
"mean" : 75,
"std" : 8
},
{
"grade" : 85,
"mean" : 90,
"std" : 5
},
{
"grade" : 85,
"mean" : 90,
"std" : 5
},
{
"grade" : 85,
"mean" : 95,
"std" : 6
},
{
"grade" : 90,
"mean" : 85,
"std" : 5
}
]
}
у нас есть 2 проблемы :
4 ответов
оператор " $ " обновляет только первое совпадение, поэтому дано:
db.students.insert({ "_id" : 4, "grades" : [
{ grade: 80, mean: 75, std: 8 },
{ grade: 85, mean: 90, std: 5 },
{ grade: 85, mean: 90, std: 5 },
{ grade: 85, mean: 95, std: 6 },
{ grade: 90, mean: 85, std: 5 } ]});
для обновления вам нужно нацелиться на $elemMatch
вот так:
db.students.update( { _id: 4, "grades": {$elemMatch: {"grade": 85, "std": 5 }}},
{ $set: { "grades.$.std" : 6 } });
, у вас есть два класса, которые соответствуют {"grades.grade": 85, "grades.std": 5}
и $
только обновляет первый, поэтому вам нужно цикл, пока все не обновлено:
db.students.update( { _id: 4, "grades": {$elemMatch: {"grade": 85, "std": 5 }}},
{ $set: { "grades.$.std" : 6 } })
while (db.getLastErrorObj()['n'] > 0) {
db.students.update( { _id: 4, "grades": {$elemMatch: {"grade": 85, "std": 5 }}},
{ $set: { "grades.$.std" : 6 } })
}
вам нужно использовать $elemMatch чтобы соответствовать внутри массива. Правила запроса в MongoDB определяют, что для условий на элементах массива любой элемент массива, где любое из условий совпадает, считается совпадением. С $elemMatch
, все условия должны совпадать на одном элементе.
точечная нотация соответствует документам, что ее критерии могут быть выполнены в любом из элементов массива.
если вы хотите сопоставить только документы, которые соответствуют всем вашим критериям в одном элементе массива (по крайней мере), то как drmirror уже ответил, вам нужно использовать оператор $elemMatch
Смотрите также: оператор$elemMatch
в вашем случае это будет:
db.students.update( {'$and':[ { _id: 4},{ "grades":{"$elemMatch": {"grade": 85, "std": 5 }}} ]}, { $set: { "grades.$.std" : 6 } } );
что касается второй части вашего вопроса, Как удалить элементы массива, см. следующий пост.
в MongoDB, как удалить элемент массива по его индексу
короче, это два шага, что первые наборы null
элемент (как вы уже делаете), а затем к $pull
(s) он выключен.
для задачи №1 обратитесь к:https://stackoverflow.com/a/20601288/773953
по сути, вам придется построить массив того, что вы хотите установить вручную.