MongoDB - sekwencja automatycznego przyrostu
MongoDB nie ma gotowej do użycia funkcji automatycznego zwiększania wartości, takiej jak bazy danych SQL. Domyślnie używa 12-bajtowego ObjectId dla_idjako klucz podstawowy do jednoznacznej identyfikacji dokumentów. Jednak mogą istnieć scenariusze, w których możemy chcieć, aby pole _id miało pewną automatycznie zwiększaną wartość inną niż ObjectId.
Ponieważ nie jest to domyślna funkcja w MongoDB, programowo osiągniemy tę funkcję przy użyciu pliku counters kolekcji zgodnie z sugestią zawartą w dokumentacji MongoDB.
Korzystanie z Counter Collection
Rozważ następujące productsdokument. Chcemy, aby pole _id miało wartośćauto-incremented integer sequence począwszy od 1,2,3,4 do n.
{
"_id":1,
"product_name": "Apple iPhone",
"category": "mobiles"
}
W tym celu utwórz plik counters kolekcja, która będzie śledzić ostatnią wartość sekwencji dla wszystkich pól sekwencji.
>db.createCollection("counters")
Teraz wstawimy następujący dokument do kolekcji counters z productid jako jego klucz -
> db.counters.insert({
"_id":"productid",
"sequence_value": 0
})
WriteResult({ "nInserted" : 1 })
>
Pole sequence_value śledzi ostatnią wartość sekwencji.
Użyj poniższego kodu, aby wstawić ten dokument sekwencji do kolekcji counters -
>db.counters.insert({_id:"productid",sequence_value:0})
Tworzenie funkcji JavaScript
Teraz stworzymy funkcję getNextSequenceValuektóra przyjmie nazwę sekwencji jako dane wejściowe, zwiększy numer sekwencji o 1 i zwróci zaktualizowany numer sekwencji. W naszym przypadku nazwa sekwencji toproductid.
>function getNextSequenceValue(sequenceName){
var sequenceDocument = db.counters.findAndModify({
query:{_id: sequenceName },
update: {$inc:{sequence_value:1}},
new:true
});
return sequenceDocument.sequence_value;
}
Korzystanie z funkcji JavaScript
Będziemy teraz używać funkcji getNextSequenceValue podczas tworzenia nowego dokumentu i przypisywania zwróconej wartości sekwencji jako pola _id dokumentu.
Wstaw dwa przykładowe dokumenty, używając następującego kodu -
>db.products.insert({
"_id":getNextSequenceValue("productid"),
"product_name":"Apple iPhone",
"category":"mobiles"
})
>db.products.insert({
"_id":getNextSequenceValue("productid"),
"product_name":"Samsung S3",
"category":"mobiles"
})
Jak widać, użyliśmy funkcji getNextSequenceValue do ustawienia wartości dla pola _id.
Aby zweryfikować funkcjonalność, pobierzmy dokumenty za pomocą polecenia znajdź -
>db.products.find()
Powyższe zapytanie zwróciło następujące dokumenty z automatycznie zwiększanym polem _id -
{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }