Mongodb 如何在mongoose中通过一次调用将一个对象数组推送到一个数组中?

Mongodb 如何在mongoose中通过一次调用将一个对象数组推送到一个数组中?,mongodb,mongoose,Mongodb,Mongoose,我需要使用一个调用将多个值推入mongoose中的数组。我试着用一个较小的数组来做,但是数组被作为子数组插入 var kittySchema = new mongoose.Schema({ name: String, values: [Number] }); var Kitten = db.model('Kitten', kittySchema); Kitten.update({name: 'fluffy'},{$push: {values:[2,3]}},{u

我需要使用一个调用将多个值推入mongoose中的数组。我试着用一个较小的数组来做,但是数组被作为子数组插入

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”选项是否可以确保不插入除Number以外的任何内容?在这种情况下,允许插入另一个数组

已弃用请参阅下面使用$push$的其他解决方案

您的示例很接近,但您希望每个值都单独添加(而不是将另一个数组推到
数组上):

(2014年12月更新)由于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");
        }
});

或者将$each修饰符与$addToSet一起使用:

当前,更新的不支持
$pushAll
。它似乎已被弃用。 现在好的选择是使用
$push
&
$each

例如:

//用户架构:{uid:String,事务:[objects]}
常量过滤器={“uid”:uid};
常数更新={
$push:{
事务:{$each:dataarr}
}
}
User.updateOne(过滤器,更新,{upsert:true},(err)=>{
如果(错误){
console.log(错误)
}
})

如果筛选器返回false,则在要插入的选项处传递
{upsert:true}

NB:您可能还想查看,该选项仅可用于向数组中添加尚未存在的值。谢谢Stennie!这很有效。我在文档中遗漏了这一部分。@Stennie这只适用于单个元素,不适用于连接数组。@Tom连接数组可以使用$addToSet与一起完成。如果不存在带有
{name:“fluffy”}
的文档,是否创建了它?;另外,如果我执行
{upsert:true,new:true}
,我是否可以执行函数(err,result){}并获得创建/更新的所有文档的结果?
Kitten.update({name: 'fluffy'}, {$push: {values: {$each: [2,3]}}}, {upsert:true}, function(err){
        if(err){
                console.log(err);
        }else{
                console.log("Successfully added");
        }
});
// Existing tags array
{ _id: 2, item: "cable", tags: [ "electronics", "supplies" ] }

// Add "camera" and "accessories" to it
db.inventory.update(
   { _id: 2 },
   { $addToSet: { tags: { $each: [ "camera", "accessories" ] } } }
 )