45

我需要使用一次调用将多个值推送到猫鼬中的数组中。我尝试使用较小的数组来执行此操作,但该数组被作为子数组插入。

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] }

我注意到的另一件事是数组(值)中的类型被指定为数字,那么“严格”选项不会确保不插入除数字之外的任何内容吗?在这种情况下,允许插入另一个数组。

4

4 回答 4

41

(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");
        }
});
于 2014-12-13T20:32:05.997 回答
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");
        }
});
于 2012-08-15T03:37:56.987 回答
5

或者将 $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" ] } } }
 )
于 2018-01-16T22:58:30.863 回答
0

目前,更新后的文档不支持$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,则传递{upsert: true}选项以插入。

于 2021-02-21T15:07:57.177 回答