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