Hinweis: Verwenden Sie die mongodb-Shell, um die Codes auszuführen.Filialdokument in MongoDB-Sammlung aktualisieren/entfernen
Lassen Sie uns sagen, dass ich ein Student Dokument haben, wie unten
{
"_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
}
]
}
Wir haben 2 Probleme:
Problem 1: können Sie sagen alle Subdokumente mit _id = 4 & & Noten aktualisiert will. Grad = 85 & & grades.std = 5, mit Std = 6 schreiben Sie wie folgt
db.students.update({'$and':[ { _id: 4},{ "grades.grade": 85 }, {"grades.std": 5 } ]}, { $set: { "grades.$.std" : 6 } });
Jetzt
, wenn Sie mehrmals (3 mal) oben Anweisung ausführen dann im Idealfall sollten sie aktualisieren 2., 3. Unterlagen
Aber letzte Teildokument wird auch immer aktualisiert beacause es std = 5 Spiel, aber wir habe die Bedingung $ und nicht $ oder gegeben, wie kommt es dann, dass das letzte Dokument aktualisiert wird?
Problem 2: Lassen Sie uns jetzt sagen Sie das Filialdokument selbst Abgleich mit Abfragekriterien entfernen will. Ich habe versucht, folgende Erklärung
db.students.update({_id:4,'grades.grade':85},{'$unset':{'grades.$':1}})
weil ungesetzt $ wird bei Unterlagen/Arrays, wie dieses Problem zu lösen null setzen?
Wie in Ihrer mongodb Konsole zu replizieren?
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 } ] });
Danke für die erste Frage Antwort, habe ich bereits mit @drmirror Antwort versucht. $ pull wird Null im Fall von Filialdokumenten setzen, dann muss ich 2 update Anweisung eine für die Aktualisierung auf Null, eine andere für das Entfernen von null aus Filialdokument ausführen. Ist es möglich, eine Update-Anweisung? –
In 2.4 zieht es die Unterdokumente und nicht als null. – Ross
extrem Sorry, My bad ... es hat funktioniert ... Vielen Dank –