Ich versuche, ein Objekt aus einem Array in einem Dokument mit Mungo zu entfernen.So entfernen Sie ein Objekt aus dem Array mit Mungo
Das Schema ist folgendes:
var diveSchema = new Schema({
//irrelevant fields
divers: [{
user: { type: Schema.Types.ObjectId, ref: 'User', required: true },
meetingLocation: { type: String, enum: ['carpool', 'onSite'], required: true },
dives: Number,
exercise: { type: Schema.Types.ObjectId, ref: 'Exercise' },
}]
});
ein möglicher Eintrag
sein kann{
//irrelevant fields
"divers": [
{
"_id": "",
"user": "123456789",
"meetingLocation": "carpool",
"exercise": "34567890",
},
{
"_id": "",
"user": "123456780",
"meetingLocation": "onSite",
"exercise": "34567890",
}
]
}
sagen, dass ich den Eintrag entfernen möchten, wo user
123456789
ist (beachten Sie, ich weiß nicht, die _id
an diesem Punkt).
Wie mache ich das richtig?
Ich habe versucht, die folgenden:
var diveId = "myDiveId";
var userIdToRemove = "123456789"
Dive.findOne({ _id: diveId }).then(function(dive) {
dive.divers.pull({ user: userIdToRemove });
dive.save().then(function(dive) {
//do something smart
});
});
Diese yieled keine Änderung in dem Dokument.
Ich habe auch versucht
Dive.update({ _id: diveId }, { "$pull": { "divers": { "diver._id": new ObjectId(userIdToRemove) } } }, { safe: true }, function(err, obj) {
//do something smart
});
Damit ich als Ergebnis bekam, dass die gesamte divers
Array für den gegebenen Tauchgang geleert wurde.
das scheint zu funktionieren! Danke, aber kannst du mir auch erklären, was ich falsch gemacht habe, weil ich vorher versucht habe, 'user' zu verwenden, aber ich habe den' multi'-Teil nicht hinzugefügt. – Sonaryr
Wie ist diese Option '{safe: true, multi: true} 'Hilfreich, wenn Sie eine Aktualisierungsoperation haben, die ein einzelnes Dokument' {_id: diveId} 'abfragt? – chridam
@chridam, Sie haben Recht, für ein einzelnes Dokument und $ pull wäre es Overkill, Multi zu verwenden: wahr, aber um ehrlich zu sein, habe ich einige Treiber gefunden, die Ausführung beendet, sobald es nur eine Operation (nicht Dokument) wenn Sie multi nicht als wahr angeben. Wenn Sie beispielsweise $ set in einem Array aufrufen, legt der Treiber nur das erste Element des Arrays für einen bestimmten Treiber fest. Deshalb benutze ich es. Sie können es vermeiden. –