¿Cómo insertar una matriz de objetos en una matriz en mangosta con una llamada?


Necesito insertar varios valores en una matriz en mongoose usando una llamada. Intenté hacerlo usando una matriz más pequeña, pero la matriz se inserta como una sub-matriz.

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

El resultado de la llamada del código anterior tres veces da el siguiente resultado:

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

Mientras que lo que quiero es algo como esto:

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

Otra cosa que noté fue que el tipo en el array (valores) se especifica como Número, entonces la opción 'strict' no aseguraría que nada más que Los números no se insertan ? En este caso se permite insertar otro array.

Author: Pranil Dasika, 2012-08-15

3 answers

Obsoleto ver otra solución, a continuación, utilizando $push $cada

Su ejemplo está cerca, pero desea que push pushAll en lugar de push push tenga cada valor agregado por separado (en lugar de empujar otro array en el array 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");
        }
});
 40
Author: Stennie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-29 17:44:15

(Dic-2014 update) Desde MongoDB2.4 debes usar:

Kitten.update({name: 'fluffy'}, {$push: {values: {$each: [2,3]}}}, {upsert:true}, function(err){
        if(err){
                console.log(err);
        }else{
                console.log("Successfully added");
        }
});
 26
Author: Amit Portnoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-13 20:32:05

O utilice el modificador $each con add 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" ] } } }
 )
 0
Author: Dominic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-16 22:58:30