Skip to content

MongoDB Auto Increment

In MongoDB, we can use auto increment functionality to assign unique identifiers to document fields. Auto increment functionality can help us solve scenarios that require unique identifiers, such as order numbers, user numbers, etc.

Basic Concepts

Types of Auto Increment

  1. ObjectId: A unique identifier automatically generated by MongoDB.
  2. Counter Collection: Use a separate collection to maintain a counter, and get the next value from the counter collection when inserting a document.
  3. Auto Increment Field: Use the $inc operator to implement auto increment.

Using ObjectId

Auto Generation of ObjectId

In MongoDB, when we insert a document, if we don't specify the _id field, MongoDB will automatically generate an ObjectId.

javascript
// When inserting a document, MongoDB automatically generates the _id field
db.users.insertOne({
  name: "John",
  age: 30,
  email: "john@example.com",
  status: "active"
})

Structure of ObjectId

ObjectId is a 12-byte BSON type field composed of the following parts:

  1. Timestamp: The first 4 bytes represent the creation time of ObjectId.
  2. Machine Identifier: The next 3 bytes represent the identifier of the machine.
  3. Process Identifier: The next 2 bytes represent the identifier of the process.
  4. Counter: The last 3 bytes represent a counter used to ensure the uniqueness of ObjectId.

Using Counter Collection

Creating a Counter Collection

javascript
// Create a counter collection
db.createCollection("counters")

// Insert a counter document
db.counters.insertOne({
  _id: "userid",
  sequence_value: 0
})

Creating an Auto Increment Function

javascript
// Create an auto increment function
function getNextSequenceValue(sequenceName) {
  const sequenceDocument = db.counters.findAndModify({
    query: { _id: sequenceName },
    update: { $inc: { sequence_value: 1 } },
    new: true
  })

  return sequenceDocument.sequence_value
}

Using the Auto Increment Function

javascript
// Insert a document using the auto increment function
db.users.insertOne({
  _id: getNextSequenceValue("userid"),
  name: "John",
  age: 30,
  email: "john@example.com",
  status: "active"
})

Using Auto Increment Field

Auto Increment when Inserting a Document

javascript
// Auto increment when inserting a document
db.users.insertOne({
  userid: 1,
  name: "John",
  age: 30,
  email: "john@example.com",
  status: "active"
})

// Auto increment when inserting the next document
const lastUser = db.users.find().sort({ userid: -1 }).limit(1).toArray()[0]
const nextUserId = lastUser.userid + 1

db.users.insertOne({
  userid: nextUserId,
  name: "Jane",
  age: 25,
  email: "jane@example.com",
  status: "pending"
})

Auto Increment when Updating a Document

javascript
// Auto increment when updating a document
db.users.updateOne(
  { _id: ObjectId("5e8f8f8f8f8f8f8f8f8f8f8f") },
  { $inc: { userid: 1 } }
)

Best Practices for Auto Increment

Choose the Right Auto Increment Method

According to the requirements of the scenario, we should choose the appropriate auto increment method. If we need a simple unique identifier, we can use ObjectId; if we need a continuous unique identifier, we can use a counter collection.

Avoid Concurrency Issues

When using a counter collection, we should pay attention to concurrency issues. If multiple processes call the getNextSequenceValue function at the same time, it may lead to duplicate identifiers.

Regular Cleaning

We should regularly clean up counters that are no longer used to save storage space.

Summary

In MongoDB, we can use auto increment functionality to assign unique identifiers to document fields. Auto increment functionality can help us solve scenarios that require unique identifiers, such as order numbers, user numbers, etc. MongoDB provides various auto increment methods, including ObjectId, counter collection, and auto increment field. When using auto increment functionality, we should choose the appropriate auto increment method, avoid concurrency issues, and clean up regularly to ensure the efficient operation of the auto increment functionality.

Content is for learning and research only.