Auto-incrémentation MongoDB

MongoDB n'a pas de fonction d'auto-incrémentation comme le fait SQL. L'_id de MongoDB est un identifiant unique de 12 octets généré automatiquement par le système.

Mais dans certains cas, nous pouvons avoir besoin d'implémenter une fonctionnalité d'auto-incrémentation pour ObjectId.

Comme MongoDB n'implémente pas cette fonctionnalité, nous pouvons le faire par programmation. Ci-dessous, nous allons implémenter l'auto-incrémentation pour le champ _id dans la collection counters.


Utiliser la collection counters

Considérez le document products suivant. Nous voulons que le champ _id ait une fonctionnalité d'auto-incrémentation de 1, 2, 3, 4 jusqu'à n.

{
  "_id":1,
  "product_name": "Apple iPhone",
  "category": "mobiles"
}

Pour ce faire, créez une collection counters. La valeur du champ sequence peut s'auto-incrémenter :

>db.createCollection("counters")

Maintenant, nous insérons le document suivant dans la collection counters, en utilisant productid comme clé :

{
  "_id":"productid",
  "sequence_value": 0
}

Le champ sequence_value est la valeur après que la séquence a été auto-incrémentée.

Utilisez la commande suivante pour insérer dans le document de séquence de la collection counters :

>db.counters.insert({_id:"productid",sequence_value:0})

Créer une fonction JavaScript

Maintenant, nous créons une fonction getNextSequenceValue qui prend le nom de la séquence en entrée. La séquence spécifiée s'auto-incrémentera de 1 et renverra la dernière valeur de la séquence. Dans cet exemple, le nom de la séquence est productid.

>function getNextSequenceValue(sequenceName){
   var sequenceDocument = db.counters.findAndModify(
      {
         query:{_id: sequenceName },
         update: {$inc:{sequence_value:1}},
         "new":true
      });
   return sequenceDocument.sequence_value;
}

Utiliser une fonction JavaScript

Ensuite, nous utiliserons la fonction getNextSequenceValue pour créer un nouveau document et définir automatiquement le _id du document sur la valeur de séquence renvoyée :

>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Apple iPhone",
   "category":"mobiles"})

>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Samsung S3",
   "category":"mobiles"})

Comme vous pouvez le voir, nous utilisons la fonction getNextSequenceValue pour définir le champ _id.

Pour vérifier si la fonction fonctionne, nous pouvons lire le document à l'aide de la commande suivante :

>db.products.find()

La commande ci-dessus renverra le résultat suivant. Nous pouvons voir que le champ _id s'incrémente automatiquement :

{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}

{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }
Autres extensions