English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
MongoDB не имеет готовых к использованию автоматических функций увеличения, как это есть в SQL-базах данных. По умолчанию, он_id
12-байтовый ObjectId поля как уникальный ключ для идентификации документа. Однако, в некоторых случаях, мы можем желать, чтобы поле _id имело некоторые автоматически увеличивающиеся значения, кроме ObjectId.
Поскольку это неdefault функция MongoDB, мы будем использовать}}counters
MongoDB документ рекомендуется использовать коллекцию для программного выполнения этой функции.
Смотрите следующийproducts
документ. Мы хотим, чтобы поле _id было последовательностью из чисел 1, 2, 3, 4 до n, автоматически увеличивающимися.
{ "_id":1, "product_name": "Apple iPhone" "category": "mobiles" }
Для этого создайтеcounters
коллекция, которая будет отслеживать последний значения всех полей последовательности.
>db.createCollection("counters")
Теперь мы вставим следующий документproductid
вставьте в коллекцию counters в качестве ключа-
>db.counters.insert({ "_id":"productid", "sequence_value": 0 ) WriteResult({ "nInserted" : 1 }) >
поле sequence_value отслеживает последний значения последовательности.
Используйте следующий код для вставки этого документа в коллекцию counters-
>db.counters.insert({_id:"productid",sequence_value:0})
Теперь мы создадим функциюgetNextSequenceValue
Эта функция принимает имя последовательности в качестве входных данных, увеличивает номер последовательности на 1 и возвращает обновленный номер последовательности. В нашем примере имя последовательности равно getNextSequenceValue.productid
。
>function getNextSequenceValue(sequenceName){ var sequenceDocument = db.counters.findAndModify({ query:{_id: sequenceName }, update: {$inc:{sequence_value:1}}, new: true }); return sequenceDocument.sequence_value; }
Теперь мы будем использовать функцию 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:
{"_id": 1, "product_name": "Apple iPhone", "category": "mobiles"} {"_id": 2, "product_name": "Samsung S3", "category": "mobiles"}