web-dev-qa-db-fra.com

Comment pousser un tableau d'objets dans un tableau en mangouste avec un seul appel?

J'ai besoin de pousser plusieurs valeurs dans un tableau en mangouste en utilisant un seul appel. J'ai essayé de le faire en utilisant un tableau plus petit, mais le tableau est inséré en tant que sous-tableau.

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

Le résultat de l'appel du code ci-dessus trois fois donne le résultat ci-dessous:

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

Alors que ce que je veux, c'est quelque chose comme ça:

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

Une autre chose que j'ai remarquée est que le type dans le tableau (valeurs) est spécifié en tant que nombre, alors l'option "stricte" ne garantirait-elle pas que rien d'autre que des nombres ne soit inséré? Dans ce cas, un autre tableau peut être inséré.

37
Pranil Dasika

(mise à jour de décembre 2014) Depuis MongoDB2.4, vous devez utiliser:

Kitten.update({name: 'fluffy'}, {$Push: {values: {$each: [2,3]}}}, {upsert:true}, function(err){
        if(err){
                console.log(err);
        }else{
                console.log("Successfully added");
        }
});
30
Amit Portnoy

Obsolète voir l'autre solution ci-dessous en utilisant $ Push $ each

Votre exemple est proche, mais vous voulez $ pushAll plutôt que $ Push pour que chaque valeur soit ajoutée séparément (plutôt que de pousser un autre tableau sur le tableau 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
Stennie

Ou utilisez le modificateur $ each avec $ 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" ] } } }
 )
2
Dominic