MongoDB - Auto-Increment-Sequenz

MongoDB verfügt nicht über sofort einsatzbereite automatische Inkrementierungsfunktionen wie SQL-Datenbanken. Standardmäßig wird die 12-Byte-Objekt-ID für die verwendet_idFeld als Primärschlüssel zur eindeutigen Identifizierung der Dokumente. Es kann jedoch Szenarien geben, in denen das Feld _id möglicherweise einen anderen automatisch inkrementierten Wert als die ObjectId aufweist.

Da dies in MongoDB keine Standardfunktion ist, erreichen wir diese Funktionalität programmgesteuert mithilfe von a counters Sammlung wie in der MongoDB-Dokumentation vorgeschlagen.

Verwenden der Zählersammlung

Folgendes berücksichtigen productsDokument. Wir möchten, dass das Feld _id ein istauto-incremented integer sequence ab 1,2,3,4 bis n.

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

Erstellen Sie dazu eine counters Sammlung, die den letzten Sequenzwert für alle Sequenzfelder verfolgt.

>db.createCollection("counters")

Jetzt fügen wir das folgende Dokument in die Zählersammlung mit ein productid als sein Schlüssel -

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

Das Feld sequence_value Verfolgt den letzten Wert der Sequenz.

Verwenden Sie den folgenden Code, um dieses Sequenzdokument in die Zählersammlung einzufügen -

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

Erstellen einer Javascript-Funktion

Jetzt erstellen wir eine Funktion getNextSequenceValueDabei wird der Sequenzname als Eingabe verwendet, die Sequenznummer um 1 erhöht und die aktualisierte Sequenznummer zurückgegeben. In unserem Fall lautet der Sequenznameproductid.

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

Verwenden der Javascript-Funktion

Wir werden jetzt die Funktion getNextSequenceValue verwenden, während wir ein neues Dokument erstellen und den zurückgegebenen Sequenzwert als _id-Feld des Dokuments zuweisen.

Fügen Sie zwei Beispieldokumente mit dem folgenden Code ein:

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

Wie Sie sehen können, haben wir die Funktion getNextSequenceValue verwendet, um den Wert für das Feld _id festzulegen.

Um die Funktionalität zu überprüfen, rufen wir die Dokumente mit dem Befehl find ab.

>db.products.find()

Die obige Abfrage gab die folgenden Dokumente mit dem automatisch inkrementierten Feld _id zurück:

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