MongoDB Auto-Inkrement
MongoDB hat keine Auto-Increment-Funktion wie SQL. MongoDBs _id ist eine eindeutige 12-Byte-Kennung, die automatisch vom System generiert wird.
In manchen Fällen müssen wir jedoch Auto-Inkrement-Funktionalität für ObjectId implementieren.
Da MongoDB diese Funktion nicht implementiert, können wir sie programmatisch umsetzen. Im Folgenden implementieren wir Auto-Inkrement für das Feld _id in der counters-Collection.
counters-Collection verwenden
Betrachten Sie das folgende products-Dokument. Wir möchten, dass das Feld _id eine Auto-Inkrement-Funktionalität von 1, 2, 3, 4 bis n hat.
{
"_id":1,
"product_name": "Apple iPhone",
"category": "mobiles"
}
Erstellen Sie dazu eine counters-Collection. Der Wert des Sequenzfelds kann automatisch inkrementiert werden:
>db.createCollection("counters")
Jetzt fügen wir das folgende Dokument in die counters-Collection ein und verwenden productid als Schlüssel:
{
"_id":"productid",
"sequence_value": 0
}
Das Feld sequence_value ist der Wert, nachdem die Sequenz automatisch inkrementiert wurde.
Verwenden Sie den folgenden Befehl, um in das Sequenzdokument der counters-Collection einzufügen:
>db.counters.insert({_id:"productid",sequence_value:0})
JavaScript-Funktion erstellen
Nun erstellen wir eine Funktion getNextSequenceValue, die den Namen der Sequenz als Eingabe erhält. Die angegebene Sequenz wird um 1 automatisch inkrementiert und gibt den neuesten Sequenzwert zurück. In diesem Beispiel ist der Sequenzname productid.
>function getNextSequenceValue(sequenceName){
var sequenceDocument = db.counters.findAndModify(
{
query:{_id: sequenceName },
update: {$inc:{sequence_value:1}},
"new":true
});
return sequenceDocument.sequence_value;
}
JavaScript-Funktion verwenden
Als Nächstes verwenden wir die Funktion getNextSequenceValue, um ein neues Dokument zu erstellen und die _id des Dokuments automatisch auf den zurückgegebenen Sequenzwert zu setzen:
>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, verwenden wir die Funktion getNextSequenceValue, um das Feld _id festzulegen.
Um zu überprüfen, ob die Funktion funktioniert, können wir das Dokument mit dem folgenden Befehl lesen:
>db.products.find()
Der obige Befehl gibt das folgende Ergebnis zurück. Wir können sehen, dass das Feld _id automatisch inkrementiert wird:
{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }
Andere Erweiterungen