Примечание: Для выполнения кодов используйте оболочку mongodb.Обновить/удалить поддокумент в коллекции MongoDB
Скажем, у меня есть один студенческий документ, как показано ниже
{
"_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 проблемы:
Проблемных 1: позволяет сказать, что вы хотите обновите все поддокументы с _id = & сортов. класс = 85 & & grades.std = 5, с std = 6, вы будете писать следующим образом
db.students.update({'$and':[ { _id: 4},{ "grades.grade": 85 }, {"grades.std": 5 } ]}, { $set: { "grades.$.std" : 6 } });
Теперь, если выполняемая выше заявление несколько раз (3 раза), то в идеале она должна обновлять 2-й, 3-й поддокументов
Но последний поддокументу также получать обновленные обусловлено это имеет зЬй = 5 матча, но мы дали условие как $ и не $ или, то как последний документ обновляется?
Задача 2: Теперь предположим, что вы хочет удалить сам поддокумент соответствия критериям запроса. Я попробовал следующее заявление
db.students.update({_id:4,'grades.grade':85},{'$unset':{'grades.$':1}})
, потому что $ незаданы поставит нуль в случае суб-документы/массивов, как решить эту проблему?
Как копировать на консоль mongodb?
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 } ] });
Спасибо за первый ответ на вопрос, я уже пробовал с ответом @drmirror. $ pull установит значение null в случае субдокументов, тогда мне нужно выполнить 2 оператора обновления один для его обновления до нулевого значения, другой для удаления нулевого значения из поддокумента. Возможно ли это для одного заявления об обновлении? –
В 2.4 его вытягивание вспомогательных документов и не задание как null. – Ross
чрезвычайно Извините, мой плохой ... это сработало ... Большое спасибо –