Автоинкремент в MongoDB

MongoDB не имеет функции автоинкремента, как в SQL. _id в MongoDB — это 12-байтовый уникальный идентификатор, автоматически генерируемый системой.

Но в некоторых случаях нам может потребоваться реализовать функциональность автоинкремента для ObjectId.

Поскольку MongoDB не реализует эту функцию, мы можем сделать это программно. Ниже мы реализуем автоинкремент для поля _id в коллекции counters.


Использование коллекции counters

Рассмотрим следующий документ products. Мы хотим, чтобы поле _id обладало функциональностью автоинкремента от 1, 2, 3, 4 до n.

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

Для этого создайте коллекцию counters. Значение поля sequence может автоматически увеличиваться:

>db.createCollection("counters")

Теперь вставим следующий документ в коллекцию counters, используя productid в качестве ключа:

{
  "_id":"productid",
  "sequence_value": 0
}

Поле sequence_value — это значение после автоматического увеличения последовательности.

Используйте следующую команду для вставки в документ последовательности коллекции counters:

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

Создание функции JavaScript

Теперь мы создаём функцию getNextSequenceValue, которая принимает имя последовательности в качестве входных данных. Указанная последовательность автоматически увеличится на 1 и вернёт последнее значение последовательности. В этом примере имя последовательности — productid.

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

Использование функции JavaScript

Далее мы будем использовать функцию getNextSequenceValue, чтобы создать новый документ и автоматически установить его поле _id в возвращённое значение последовательности:

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

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

Как видите, мы используем функцию getNextSequenceValue для задания поля _id.

Чтобы проверить, работает ли функция, мы можем прочитать документ с помощью следующей команды:

>db.products.find()

Приведённая выше команда вернёт следующий результат. Мы видим, что поле _id автоматически увеличивается:

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

{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }
Другие расширения