2016-09-30 5 views
1

Ich habe ein Filmmodell, das auf ein Benutzermodell nach Objekt-ID verweist. Ein Benutzer kann sich selbst aus der Teilnehmerliste hinzufügen oder entfernen, und ich versuche, ihn mit mode.findOneAndUpdate zu implementieren. Ich lese, dass ich $ set hinzufügen sollte der bestehende Teilnehmer wird nicht gelöscht werden, aber selbst mit $ gesetzt, wenn ein Benutzer fügt sich alle vorhandenen Benutzer gelöscht werden und jetzt dieser Benutzer ist der einzige auf der Liste.Aktualisieren eines Dokuments ohne Löschen vorhandener Werte

Hier ist der Code:

Filmmodell

{ 
    "_id" : ObjectId("fhdfdca5e1b94fafadhfg1"), 
    "date" : ISODate("2016-10-05T13:56:43.939Z"), 
    "attending" : [ 
     ObjectId("fhdf6d0e4501f294a6dgd2") 
    ], 
    "__v" : 0 
} 

hier ist mein findandupdate:

... 
.findOneAndUpdate({_id:req.body.movieId}, {$set:{attending:req.body.imAttending}}, {upsert:true}) 

Wie kann ich einen Artikel auf meiner Teilnahme Liste einfach hinzufügen?

TL; DR

Verwendung $ Push nicht $ gesetzt, wenn Sie nur eindeutige Werte nicht Wiederholung in Ihrer Liste etwas dagegen oder addToSet $. Siehe Antwort und Kommentare unten.

Antwort

3

Da attending ein Array ist, sollten Sie $push verwenden:

.findOneAndUpdate({ 
    _id : req.body.dinnerId 
}, { 
    $push : { attending : req.body.imAttending } 
}, ...) 
+0

Großartig! Ich bin mir sicher, dass ich das gesucht habe, da das $ set anscheinend nicht funktionierte. Ich vermutete, dass es einen anderen Operator für ein Array gibt. Wo ist die Liste mit allen Operatoren? –

+0

@ S.Schenk siehe [diese Liste] (https://docs.mongodb.com/manual/reference/operator/update/#id1) für Update-Betreiber. Die globale Liste der Operatoren beginnt mit [hier] (https://docs.mongodb.com/manual/reference/operator/). – robertklep

+0

Ich habe bemerkt, dass es immer denselben Benutzer zur Liste hinzufügt, auch wenn es hinzugefügt wurde. Ich habe versucht, das mit Unique auf meiner Referenzliste zu verhindern, aber das hat nicht funktioniert. Irgendwelche Hinweise? –

0

Ich hatte ein Problem wie dieses auch schon. Wenn Sie finden Sie einen und Update verwenden, um den Mengenoperator wie folgt:

modelname.findOneAndUpdate({ 
 
    email: var_email}, 
 
    { $set: { 
 
    token: var_token, 
 
    platform: var_platform}}, 
 
    { new: true }, function(err, doc) 
 
{ 
 
    //doc here has updated document, in case you need it. 
 
});

Es Art von ähnlich sieht, was Sie geschrieben haben. Aber es sollte einige Parameter übernehmen und sie auf das aktuelle Objekt setzen. Wenn dies bei dem, was Sie versuchen, falsch ist. Kommentiere unten.

+0

Das sind die Parameter nur innerhalb eines Objekts. Ich habe das für Geräte benutzt. SO befanden sich das Token und die Plattform in meinem mongodb-Objekt. Für Ihre Position wäre es ID, Datum oder Teilnahme –

Verwandte Themen