如何通过一次调用将一组对象推入mongoose中的数组?

时间:2012-08-15 03:18:13

标签: 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]}},{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'选项是否确保没有插入除NUM之外的任何内容?在这种情况下,允许插入另一个数组。

4 个答案:

答案 0 :(得分:40)

已弃用 请使用$ push $ each查看下面的其他解决方案

您的示例已接近,但您希望$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");
        }
});

答案 1 :(得分:30)

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

答案 2 :(得分:2)

或者将$ each修饰符与$ addToSet:

一起使用

https://docs.mongodb.com/manual/reference/operator/update/addToSet/#each-modifier

// 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" ] } } }
 )

答案 3 :(得分:0)

目前,更新的 Playground 不支持 declare function tranpose<T extends typeof original>(original: T): Transpose<T>; const test2 = tranpose(original)[2]; //{ value: 3; label: "three"; } 。它似乎已被弃用。 现在最好的选择是使用 $pushAll$push

的组合

一个例子:

$each

在选项中传递 //User schema: {uid: String, transaction: [objects] } const filter = {"uid": uid}; const update = { $push: { transactions: {$each: dataarr} } } User.updateOne(filter, update, {upsert:true}, (err) => { if(err){ console.log(err) } }) 以在过滤器返回 false 时插入。