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