Автоинкремент в 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" }
Другие расширения