2012-08-15 10 views
29

Tek bir çağrı kullanarak, çoklu değerleri bir diziye dönüştürmem gerekiyor. Daha küçük bir dizi kullanarak yapmayı denedim ancak dizi bir alt dizi olarak ekleniyor.Tek bir aramayla bir dizi nesneyi mongoose'daki bir diziye nasıl aktarılır?

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

Fark başka şey olmasıydı:

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

böyle bir şeydir:

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"); 
     } 
}); 

çağıran Yukarıdaki kod sonucu üç kez aşağıda sonuç verir dizideki (değerler) tip, Number olarak belirtilir, daha sonra 'katı' seçeneği, Sayılar dışındaki herhangi bir şeyin eklenmediğinden emin olmaz mıydı? Bu durumda başka bir dizinin eklenmesine izin verilir.

cevap

39

her

Sizin örnek yakındır $ itme $ kullanarak aşağıda başka bir çözüm görüyorum ama her değer doğrusu values dizinin üzerine başka dizi iterek daha (ayrı ekletmeye $pushAll yerine $push istiyorum kullanımdan kaldırıldı):

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: Ayrıca [$ addToSet] (http bakmak isteyebilirsiniz .Mongodb.org/display/DOCS/Güncelleniyor/# Güncelleniyor -% 24addToSetand% 24each), yalnızca bir diziye değer eklemek için kullanılabilir. – Stennie

+0

Teşekkürler Stennie! Bu işe yarıyor. Bu kısımdaki belgeleri kaçırdım. –

+0

@Stennie bu sadece dizileri birleştirmek için değil, tek tek elemanlar için çalışır. – Tom

20

kullanmanız gereken MongoDB2.4 yana (Aralık-2014 güncellemesi):

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

Eğer içinde {name: "fluffy"} 'bulunan bir belge yoksa, {upsert: true}' yaratır mı ?; Ayrıca, {upsert: true, new: true} 'işlevini kullanırsam, işlev (err, sonuç) {} yapabilir ve sonuçta oluşturulan/güncelleştirilen tüm belgeleri alabilir miyim? – Besto