Croissance automatique de MongoDB
MongoDB n'a pas de fonction de croissance automatique comme SQL. Le _id de MongoDB est un identifiant unique de 12 octets généré automatiquement par le système.
Mais dans certains cas, nous devrons peut-être implémenter la fonction de croissance automatique ObjectId.
Étant donné que MongoDB n'implémente pas cette fonction, nous pouvons l'implémenter par programme ci-dessous. Implémentez la croissance automatique du champ _id dans la collection counters.
Utiliser la collection de compteurs
Considérez le document de produits suivant. Nous voulons que le champ _id implémente Fonction d'incrémentation automatique de 1,2,3,4 à n.
{ "_id":1, "product_name": "Apple iPhone", "category": "mobiles" }
Pour ce faire, créez une collection de compteurs, et la valeur du champ de séquence peut être automatiquement longue :
>db.createCollection("counters")
Maintenant, nous insérons le document suivant dans la collection de compteurs, en utilisant productid comme clé :
{ "_id":"productid", "sequence_value": 0 }
Le champ séquence_value est une valeur de la séquence après croissance automatique.
Insérer dans le document de séquence la collection de compteurs à l'aide de la commande suivante :
>db.counters.insert({_id:"productid",sequence_value:0})
Créer une fonction Javascript
Maintenant, nous créons la fonction getNextSequenceValue comme entrée pour le nom de la séquence, La séquence spécifiée est automatiquement incrémentée de 1 et la dernière valeur de séquence est renvoyée. Dans l'exemple de cet article la séquence est nommée productid .
>function getNextSequenceValue(sequenceName){ var sequenceDocument = db.counters.findAndModify( { query:{_id: sequenceName }, update: {$inc:{sequence_value:1}}, new:true }); return sequenceDocument.sequence_value; }
Utilisation des fonctions Javascript
Ensuite, nous utiliserons la fonction getNextSequenceValue pour créer un nouveau document, Et en définissant automatiquement le document _id 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.
Afin de vérifier si la fonction est valide, nous pouvons utiliser la commande suivante pour lire le document :
>db.products.find()
La commande ci-dessus retournera les résultats suivants, et nous constatons que le champ _id est auto-augmentant :
{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"} { "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }