Иногда становится важным иметь в базе данных настраиваемое поле с номером автоинкремента, отличным от .
Давайте рассмотрим пример книг в библиотеке. Наряду с уникальным «_id», предоставляемым mongodb, нам может понадобиться «book_id», чтобы иметь количество книг в библиотеке.
Использование ‘mongoose-auto-increment’ для реализации автоматического увеличения
«Mongoose-auto-increment» — это плагин, который автоматически увеличивает любое поле идентификатора в вашей схеме каждый раз, когда документ сохраняется.
Сначала нам нужно установить «mongoose-auto-increment».
npm install mongoose-auto-increment
Как только мы установим плагин, его будет очень просто использовать. Нам нужно получить ссылку на него, инициализировать его, передав ваше соединение с мангустом, и передать autoincrement.plugin функции plugin() в вашей схеме. В приведенном ниже примере мы видим, как мы можем использовать плагин «mongoose-auto-increment» с mongoose.
var mongoose = require('mongoose'), Schema = mongoose.Schema, autoIncrement = require('mongoose-auto-increment'); var connection = mongoose.createConnection("mongodb://localhost/myDatabase"); autoIncrement.initialize(connection); var bookSchema = new Schema({ author: String, title: String, genre: String, publishDate: Date }); bookSchema.plugin(autoIncrement.plugin, { model: 'Book', field: 'bookId' }); var Book = connection.model('Book', bookSchema);
Мы можем увеличить поле, такое как «bookid», как показано в приведенном выше примере. Если мы хотим, чтобы это поле начиналось с числа, отличного от нуля, или увеличивалось более чем на единицу, мы можем сделать это, как показано ниже.
bookSchema.plugin(autoIncrement.plugin, { model: 'Book', field: 'bookId', startAt: 100, incrementBy: 100 });
Создание пользовательского автоинкремента
MongoDB не предоставляет каких-либо готовых функций автоматического увеличения, таких как базы данных SQL. По умолчанию поле _id используется в качестве первичного ключа для уникальной идентификации документов.
Давайте рассмотрим следующий документ employees. Мы хотим, чтобы поле _id представляло собой целочисленную последовательность с автоматическим увеличением, начиная с 1,2,3,4 и заканчивая n.
{ "_id":1, "emploee_name": "Raj", "company": "abc" }
Теперь давайте создадим коллекцию counters, которая будет отслеживать последнее значение последовательности для всех полей последовательности.
>db.createCollection("counters")
Теперь давайте вставим следующий документ в коллекцию счетчиков с employeeid в качестве ключа.
> db.counters.insert({ "_id":"employeeid", "sequence_value": 0 }) WriteResult({ "nInserted" : 1 })
Поле sequence_value отслеживает последнее значение последовательности.
Используйте следующий код, чтобы вставить этот документ последовательности в коллекцию счетчиков.
>db.counters.insert({_id:"employeeid",sequence_value:0})
Теперь мы создадим функцию getNextSequenceValue, которая будет принимать имя последовательности в качестве входных данных, увеличивать порядковый номер на 1 и возвращать обновленный порядковый номер. В нашем случае имя последовательности — employeeid.
>function getNextSequenceValue(sequenceName){ var sequenceDocument = db.counters.findAndModify({ query:{_id: sequenceName }, update: {$inc:{sequence_value:1}}, new:true }); return sequenceDocument.sequence_value; }
Теперь мы можем использовать функцию getNextSequenceValue, чтобы получить следующую последовательность no, как показано ниже.
>db.employees.insert({ "_id":getNextSequenceValue("employeeid"), "employee_name":"Raj", "company":"abc" }) >db.employees.insert({ "_id":getNextSequenceValue("employeeid"), "employee_name":"Ram", "company":"xyz" })
Теперь давайте посмотрим на результаты, используя поисковый запрос.
>db.employees.find()
Приведенный выше запрос вернул следующие документы с автоматически увеличивающимся полем _id.
{ "_id" : 1, "employee_name" : "Ram", "company":"abc"} { "_id" : 2, "employee_name" : "Raj", "company":"xyz" }
Вывод
В этом руководстве мы увидели, как вставить число автоинкремента в mongodb, используя два разных метода. Сначала использовал плагин «mongoose-auto-increment». Вторая реализация пользовательского автоинкремента.