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" }