2012-08-15 47 views
29

我需要使用一个调用将多个值推入猫鼬的数组中。我试着用一个较小的数组来做这件事,但是这个数组被插入为一个子数组。如何用一次调用将对象数组推入猫鼬阵列中?

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

调用上面的代码的结果三次给出了如下结果:

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

而我要的是这样的:

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

我注意到另一件事是,数组中的类型(值)被指定为Number,那么'strict'选项将确保除了Numbers之外的任何其他内容都不会被插入?在这种情况下,允许插入另一个数组。

回答

39

弃用见下文使用$推$每个

你举的例子是接近其他的解决办法,但你要$pushAll,而不是$push让每个值分别增加(而不是推另一个数组到values阵列):

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

注意:您可能也想看看[$ addToSet(HTTP:// WWW .mongodb.org/display/DOCS/Updating /#Updating-%24addToSetand%24each),如果它们不存在的话,它们可以用来为数组添加值。 – Stennie 2012-08-15 03:39:58

+0

谢谢Stennie!这样可行。我错过了文档中的这一部分。 – 2012-08-15 04:44:54

+0

@Stennie这只适用于单个元素,不适用于连接数组。 – Tom 2013-12-24 16:54:22

20

(十二月2014年更新)由于MongoDB2.4你应该使用:

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

如果不存在带{'name:'蓬松“}的文档,'{upsert:true}'是否创建它?另外,如果我做了'{upsert:true,new:true}',我可以执行函数(err,result){}并获得所有创建/更新的文档的结果吗? – Besto 2016-12-04 17:06:38