MongoDB - Séquence d'incrémentation automatique

MongoDB n'a pas de fonctionnalité d'incrémentation automatique prête à l'emploi, comme les bases de données SQL. Par défaut, il utilise l'ObjectId de 12 octets pour le_idcomme clé primaire pour identifier de manière unique les documents. Cependant, il peut y avoir des scénarios dans lesquels nous souhaitons que le champ _id ait une valeur auto-incrémentée autre que ObjectId.

Comme il ne s'agit pas d'une fonctionnalité par défaut dans MongoDB, nous réaliserons cette fonctionnalité par programmation en utilisant un counters collection comme suggéré par la documentation MongoDB.

Utilisation de la collection de compteurs

Considérer ce qui suit productsdocument. Nous voulons que le champ _id soit unauto-incremented integer sequence à partir de 1,2,3,4 jusqu'à n.

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

Pour cela, créez un counters collection, qui gardera une trace de la dernière valeur de séquence pour tous les champs de séquence.

>db.createCollection("counters")

Maintenant, nous allons insérer le document suivant dans la collection counters avec productid comme sa clé -

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

Le champ sequence_value garde la trace de la dernière valeur de la séquence.

Utilisez le code suivant pour insérer ce document de séquence dans la collection counters -

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

Créer une fonction Javascript

Maintenant, nous allons créer une fonction getNextSequenceValuequi prendra le nom de la séquence comme entrée, incrémentera le numéro de séquence de 1 et renverra le numéro de séquence mis à jour. Dans notre cas, le nom de la séquence estproductid.

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

Utilisation de la fonction Javascript

Nous allons maintenant utiliser la fonction getNextSequenceValue lors de la création d'un nouveau document et de l'affectation de la valeur de séquence retournée comme champ _id du document.

Insérez deux exemples de documents en utilisant le code suivant -

>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 avons utilisé la fonction getNextSequenceValue pour définir la valeur du champ _id.

Pour vérifier la fonctionnalité, récupérons les documents en utilisant la commande find -

>db.products.find()

La requête ci-dessus a renvoyé les documents suivants avec le champ _id auto-incrémenté -

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