Учебники

MongoDB — Автоинкрементная последовательность

MongoDB не имеет встроенной функции автоинкремента, как базы данных SQL. По умолчанию он использует 12-байтовый ObjectId для поля _id в качестве первичного ключа для уникальной идентификации документов. Однако могут быть сценарии, в которых мы можем захотеть, чтобы поле _id имело какое-то автоматически увеличиваемое значение, кроме ObjectId.

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

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

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

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

Для этого создайте коллекцию счетчиков , которая будет отслеживать последнее значение последовательности для всех полей последовательности.

>db.createCollection("counters")

Теперь мы вставим следующий документ в коллекцию счетчиков с ключом productid

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

Поле sequence_value отслеживает последнее значение последовательности.

Используйте следующий код для вставки этого документа последовательности в коллекцию счетчиков —

>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.

Чтобы проверить функциональность, давайте загрузим документы с помощью команды find —

>db.products.find()

Приведенный выше запрос вернул следующие документы с автоинкрементным полем _id —