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 —