English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB Основы

MongoDB Уровень 2 Документация

Автоматически увеличивающийся сеquence

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

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

Используйте коллекцию счетчиков

Смотрите следующий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})

Создайте функцию JavaScript

Теперь мы создадим функцию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;
}

Используйте функцию 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:

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