Обновление / удаление вложенного документа в коллекции 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

по сути, вам придется построить массив того, что вы хотите установить вручную.