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 —