MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $push

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 avec update() 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.