2012-08-15 14 views
29

Ich muss mehrere Werte in einem Array in Mungo mit einem Anruf schieben. Ich versuchte es mit einem kleineren Array, aber das Array wird als Sub-Array eingefügt.Wie schiebe ich ein Array von Objekten in einem Array in Mungo mit einem Anruf?

var kittySchema = new mongoose.Schema({ 
     name: String, 
     values: [Number] 
}); 

var Kitten = db.model('Kitten', kittySchema); 
Kitten.update({name: 'fluffy'},{$push: {values:[2,3]}},{upsert:true},function(err){ 
     if(err){ 
       console.log(err); 
     }else{ 
       console.log("Successfully added"); 
     } 
}); 

Das Ergebnis des obigen Code Aufruf gibt dreimal das folgende Ergebnis:

{ "_id" : ObjectId("502b0e807809d79e84403606"), "name" : "fluffy", "values" : [ [ 2, 3 ], [ 2, 3 ], [ 2, 3 ] ] } 

Während was ich will, ist so etwas wie dieses:

{ "_id" : ObjectId("502b0e807809d79e84403606"), "name" : "fluffy", "values" : [ 2, 3 ,2 ,3, 2, 3] } 

Eine andere Sache, ich war aufgefallen, dass der Typ im Array (Werte) wird als Zahl angegeben, dann würde die "strikte" Option sicherstellen, dass nichts anderes als Zahlen eingefügt wird? In diesem Fall darf ein anderes Array eingefügt werden.

Antwort

39

Veraltete sehen andere Lösung $ Push $ pro

Ihr Beispiel ist in der Nähe unten, aber Sie wollen $pushAll anstatt $push jeder Wert haben, separat hinzugefügt (und nicht ein anderes Array auf die values Array schieben):

var Kitten = db.model('Kitten', kittySchema); 
Kitten.update({name: 'fluffy'},{$pushAll: {values:[2,3]}},{upsert:true},function(err){ 
     if(err){ 
       console.log(err); 
     }else{ 
       console.log("Successfully added"); 
     } 
}); 
+16

NB: // www: Sie auch auf [$ addToSet] (http aussehen mögen .mongodb.org/display/DOCS/Updating/# Updating-% 24addToSetand% 24each), mit denen nur Werte zu einem Array hinzugefügt werden können, wenn sie nicht bereits vorhanden sind. – Stennie

+0

Danke Stennie! Das funktioniert. Ich habe diesen Teil in der Dokumentation verpasst. –

+0

@Stennie Dies funktioniert nur für einzelne Elemente, nicht für die Verkettung von Arrays. – Tom

20

(Dec-2014-Update) Seit MongoDB2.4 sollten Sie verwenden:

Kitten.update({name: 'fluffy'}, {$push: {values: {$each: [2,3]}}}, {upsert:true}, function(err){ 
     if(err){ 
       console.log(err); 
     }else{ 
       console.log("Successfully added"); 
     } 
}); 
+0

Wenn kein Dokument mit '{name:" fluffy "}' existiert, wird '{upsert: true}' erstellt ?; Auch wenn ich '{upsert: true, new: true}', kann ich Funktion (err, result) {} ausführen und alle Dokumente, die erstellt/aktualisiert wurden, in das Ergebnis übernehmen? – Besto

Verwandte Themen