2016-11-14 31 views
2

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 user123456789 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.

Antwort

5

Was ist damit?

Dive.update({ _id: diveId }, { "$pull": { "divers": { "user": userIdToRemove } }}, { safe: true, multi:true }, function(err, obj) { 
    //do something smart 
}); 
+0

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

+0

Wie ist diese Option '{safe: true, multi: true} 'Hilfreich, wenn Sie eine Aktualisierungsoperation haben, die ein einzelnes Dokument' {_id: diveId} 'abfragt? – chridam

+0

@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. –

0

Versuchen Sie, diese

Dive.update ({_id: diveId}, { "$ pull": { "Treiber": { "user": "123456789"}}})

+0

das hat nicht funktioniert. – Sonaryr

Verwandte Themen