English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
MongoDB n'a pas de fonctionnalité auto-incrementée prête à l'emploi comme les bases de données SQL. Par défaut, il va_id
du champ12L'ObjectId de byte est utilisé comme clé principale pour identifier de manière unique le document. Cependant, dans certains cas, nous pourrions souhaiter que le champ _id ait une valeur auto-incrementée en plus de ObjectId.
Comme cela n'est pas une fonctionnalité par défaut dans MongoDB, nous le ferons en utilisantcounters
Implémenter cette fonctionnalité de manière programmée en utilisant les recommandations de collection de document MongoDB.
Voyez ci-dessousproducts
nous souhaitons que le champ _id soit un1,2,3,4séquence croissante auto-incrementée de n.
{ "_id":1, "product_name": "Apple iPhone", "category": "mobiles" }
Pour cela, créez unecounters
Cette collection va suivre la dernière valeur de la séquence de tous les champs de séquence.
>db.createCollection("counters")
Maintenant, nous allons insérer le document suivantproductid
inséré en tant que clé dans la collection counters-
> db.counters.insert({ "_id":"productid", "sequence_value": 0 ) WriteResult({ "nInserted" : 1 ) >
le champ sequence_value suit 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})
Maintenant, nous allons créer une fonctiongetNextSequenceValue
, cette fonction prend le nom de séquence en entrée, ajoute1et renvoyer le numéro de séquence mis à jour. Dans notre exemple, le nom de 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; }
Maintenant, nous allons utiliser la fonction getNextSequenceValue pour obtenir la valeur de séquence retournée et l'affecter au champ _id du document.
Utilisez le code suivant pour insérer deux documents de texte-
>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é, utilisons la commande find pour obtenir le document-
>db.products.find()
La requête ci-dessus a retourné les documents suivants avec le champ _id auto-incrementé-
{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"} { "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }