Подтвердить что ты не робот

Как нажимать массив объектов в массив в мангусте с одним вызовом?

Мне нужно нажать несколько значений в массив в мангусте, используя один вызов. Я попытался сделать это с помощью меньшего массива, но массив вставлен в качестве подматрицы.

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, тогда не будет ли "строгая" опция гарантировать, что ничего, кроме Numbers, не будет вставлено? В этом случае разрешается вставлять другой массив.

4b9b3361

Ответ 1

Устаревшее см. другое решение, использующее $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");
        }
});

Ответ 2

(обновление Dec-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");
        }
});