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