Dans MongoDB, vous pouvez utiliser le $push
opérateur pour ajouter une valeur à un tableau.
Vous pouvez utiliser divers modificateurs pour spécifier la position de la valeur dans le tableau, l'ordre des éléments dans le tableau, ajouter plusieurs valeurs, etc.
Exemple
Supposons que nous ayons une collection appelée products
avec les documents suivants :
db.products.find()
Résultat :
{ "_id" :1, "product" :"Bat", "sizes" :[ "S", "M", "L" ] }{ "_id" :2, "product" :"Chapeau" , "sizes" :[ "S", "L", "XL" ] }{ "_id" :3, "product" :"Cap", "sizes" :[ "M", "L" ] }Et disons que nous voulons ajouter une valeur au tableau dans le document 3.
Nous pouvons utiliser
$push
en conjonction avecupdate()
pour ajouter la valeur :db.products.update( { _id: 3 }, { $push: { sizes: "XL" } } )
Sortie :
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })Examinons à nouveau la collection pour vérifier le changement :
db.products.find()
Résultat :
{ "_id" :1, "product" :"Bat", "sizes" :[ "S", "M", "L" ] }{ "_id" :2, "product" :"Chapeau" , "sizes" :[ "S", "L", "XL" ] }{ "_id" :3, "product" :"Cap", "sizes" :[ "M", "L", "XL" ] }Insérer la valeur à une certaine position
Vous pouvez utiliser le
$each
et$position
modificateurs pour spécifier où la valeur doit être insérée dans le tableau.Par exemple, nous pouvons utiliser une valeur de
0
pour l'insérer au début du tableau.Exemple :
db.products.update( { _id: 3 }, { $push: { sizes: { $each: [ "S" ], $position: 0 } } } )
Sortie :
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })Le
$each
le modificateur ajoute plusieurs valeurs au champ de tableau. Dans ce cas, nous n'avons inséré qu'une seule valeur dans le tableau, cependant, pour utiliser le$position
modificateur, il doit apparaître avec le$each
modificateur.Vérifions à nouveau la collection :
db.products.find()
Résultat :
{ "_id" :1, "product" :"Bat", "sizes" :[ "S", "M", "L" ] }{ "_id" :2, "product" :"Chapeau" , "sizes" :[ "S", "L", "XL" ] }{ "_id" :3, "product" :"Cap", "sizes" :[ "S", "M", "L" , "XL" ] }Ajouter et trier
Supposons que nous ayons une collection avec les documents suivants :
db.players.find()
Résultat :
{ "_id" :1, "scores" :[ 1, 5, 3 ] }{ "_id" :2, "scores" :[ 8, 17, 18 ] }{ "_id" :3, "scores " :[ 15, 11, 8 ] }Et supposons que nous voulions ajouter des valeurs au tableau dans le document 3, mais nous voulons également trier le tableau par ordre croissant après avoir ajouté la valeur.
Nous pouvons faire ceci :
db.players.update( { _id: 3 }, { $push: { scores: { $each: [ 5, 12 ], $sort: 1 } } } )
Sortie :
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })Maintenant, lorsque nous visualisons la collection, nous pouvons voir que le troisième document a été modifié en conséquence.
db.players.find()
Résultat :
{ "_id" :1, "scores" :[ 1, 5, 3 ] }{ "_id" :2, "scores" :[ 8, 17, 18 ] }{ "_id" :3, "scores " :[ 5, 8, 11, 12, 15 ] }Pour le trier par ordre décroissant, utilisez
$sort: -1
.Découper le tableau
Vous pouvez utiliser le
$slice
modificateur pour limiter le nombre d'éléments dans le tableau.Par exemple, ajoutons une autre valeur au tableau, puis découpons le tableau en un certain nombre d'éléments.
db.players.update( { _id: 3 }, { $push: { scores: { $each: [ 3 ], $slice: 3 } } } )
Sortie :
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })Maintenant, vérifions à nouveau la collection :
db.players.find()
Résultat :
{ "_id" :1, "scores" :[ 1, 5, 3 ] }{ "_id" :2, "scores" :[ 8, 17, 18 ] }{ "_id" :3, "scores " :[ 5, 8, 11 ] }Dans ce cas, le tableau a été tranché, mais la valeur que nous avons ajoutée ne s'est même pas retrouvée dans le tableau final. C'est parce que la valeur a été ajoutée au tableau et nous n'avons pas utilisé de
$sort
opération, et ainsi la valeur est restée à la fin du tableau avant que le tableau ne soit découpé en ses trois premiers éléments.Le revoilà, sauf cette fois avec le
$sort
modificateur.db.players.update( { _id: 3 }, { $push: { scores: { $each: [ 3 ], $sort: 1, $slice: 3 } } } )
Sortie :
WriteResult({ "nMatched" :1, "nUpserted" :0, "nModified" :1 })Vérifiez la collection :
db.players.find()
Résultat :
{ "_id" :1, "scores" :[ 1, 5, 3 ] }{ "_id" :2, "scores" :[ 8, 17, 18 ] }{ "_id" :3, "scores " :[ 3, 5, 8 ] }Ajouter une valeur uniquement si elle n'existe pas
Si vous souhaitez que la valeur soit ajoutée uniquement si elle n'existe pas déjà dans le tableau, envisagez d'utiliser le
$addToSet
opérateur.