Hướng dẫn auto-increment mongodb - mongodb tự động gia tăng

Không như những Hệ quản trị CSDL khác như MySQL, PostgreSQL,… MongoDB không có khái niệm Auto-Increment. Mỗi một bản ghi khi được thêm vào CSDL sẽ có 1 object ID với các ký tự ngẫu nhiên (Hoặc theo 1 quy tắc do MongoDB định nghĩa)MongoDB không có khái niệm Auto-Increment. Mỗi một bản ghi khi được thêm vào CSDL sẽ có 1 object ID với các ký tự ngẫu nhiên (Hoặc theo 1 quy tắc do MongoDB định nghĩa)

Hướng dẫn auto-increment mongodb - mongodb tự động gia tăng

Bài viết này sẽ hướng dẫn cách tạo một trường tự động tăng (Auto-Increment Field) trong MongoDB

Sử dụng counters collection

Ý nghĩa của cách này là tạo 1 bảng để lưu lại giá trị tăng dần của ID.

Ví dụ: Tạo bảng users có trường _id là số tư nhiên tự tăng: Tạo bảng users có trường _id là số tư nhiên tự tăng

Mở Mongo Shell để thực hiện các bước sau:

Bước 1: Tạo bảng counters bằng việc thêm 1 bản ghi có cấu trúc object như sau:: Tạo bảng counters bằng việc thêm 1 bản ghi có cấu trúc object như sau:

db.counters.insert(
   {
      _id: "userid",
      seq: 0
   }
)

Bước 2: Tạo hàm javascript để lấy ID tiếp theo (Cú paste function này vào Mongo Shell): Tạo hàm javascript để lấy ID tiếp theo (Cú paste function này vào Mongo Shell)

function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}

Bước 3: Xác nhận bằng việc thêm dữ liệu cho bảng users như sau: Xác nhận bằng việc thêm dữ liệu cho bảng users như sau

db.users.insert(
   {
     _id: getNextSequence("userid"),
     name: "Nguyen Van A"
   }
)

db.users.insert(
   {
     _id: getNextSequence("userid"),
     name: "Nguyen Van B"
   }
)

Kết quả: 

Hướng dẫn auto-increment mongodb - mongodb tự động gia tăng

Chú ý: Để tạo thêm trường Auto-Increment cho bảng khác ví dụ bảng products chẳng hạn. Chúng ta thêm 1 bản ghi vào bảng counters với trường _id: “productid”, rồi thêm dữ liệu cho bảng products giống như là:: Để tạo thêm trường Auto-Increment cho bảng khác ví dụ bảng products chẳng hạn. Chúng ta thêm 1 bản ghi vào bảng counters với trường _id: “productid”, rồi thêm dữ liệu cho bảng products giống như là:

db.products.insert(
   {
     _id: getNextSequence("productid"),
     name: "Máy hàn"
   }
)

Lưu ý: MongoDB khuyên chúng ta nếu không cần thiết thì không nên tạo auto-increment.MongoDB khuyên chúng ta nếu không cần thiết thì không nên tạo auto-increment.

Generally in MongoDB, you would not use an auto-increment pattern for the _id field, or any field, because it does not scale for databases with large numbers of documents. Typically the default value ObjectId is more ideal for the _id._id field, or any field, because it does not scale for databases with large numbers of documents. Typically the default value ObjectId is more ideal for the _id.

Nguồn: vinasupport.com

Điều kiện tiên quyết

Hướng dẫn này giả định rằng bạn đã cài đặt và định cấu hình một tài khoản và cụm Atlas MongoDB. Nếu bạn chưa làm như vậy, hãy làm theo các bước dưới đây:

  • Sẵn sàng một cụm hoặc tạo một. Bạn có thể tạo một cụm Atlas MongoDB miễn phí. Tìm hiểu thêm về MongoDB Atlas.
  • Tạo người dùng cơ sở dữ liệu và thêm IP công khai của bạn để có quyền truy cập mạng vào cụm.
  • Tải xuống Sò Mongo và sau đó thêm
  • Sử dụng chuỗi kết nối cụm cụm trên dòng lệnh của bạn để kết nối với cụm và truy cập nó thông qua vỏ Mongo.

Lưu ý: Tất cả các lệnh trong hướng dẫn này được chạy trên vỏ Mongo.: All the commands in this tutorial are run on the mongo shell.

Cân nhắc

Để đảm bảo cơ sở dữ liệu của bạn vẫn có thể mở rộng với một số lượng lớn tài liệu, chúng tôi khuyên bạn nên tránh việc sử dụng mẫu tự động cho trường _ID hoặc bất kỳ trường nào trong MongoDB. Trong trường hợp thất bại đồng thời, việc sử dụng một mẫu như vậy có thể dẫn đến sự trùng lặp dữ liệu.

Giá trị mặc định là lý tưởng cho _ID được tạo tự động chứ không phải là giá trị tự động. Tham khảo tài liệu chính thức của MongoDB trên ID đối tượng để biết thêm thông tin.

Làm thế nào để tự động tăng cường hoạt động trong MongoDB?

Mặc dù MongoDB không hỗ trợ chuỗi tự động kích thích như một tính năng mặc định như một số cơ sở dữ liệu quan hệ, chúng tôi vẫn có thể đạt được chức năng này bằng cách sử dụng bộ sưu tập truy cập. Bộ sưu tập bộ đếm sẽ có một tài liệu duy nhất theo dõi giá trị định danh duy nhất hiện tại. Tìm hiểu làm thế nào để tạo một bộ sưu tập truy cập và thực hiện tự động dưới đây.

Hướng dẫn từng bước để tự động nâng một trường trong Atlas MongoDB bằng cách sử dụng hàm JavaScript

Chúng tôi sẽ triển khai chức năng tự động bằng cách sử dụng Atlas Triggersin MongoDB. Trình kích hoạt cho phép bạn lên lịch thực hiện logic phía máy chủ hoặc thực thi nó để đáp ứng với các sự kiện cơ sở dữ liệu. Tìm hiểu thêm về kích hoạt cơ sở dữ liệu là gì.Triggersin MongoDB Atlas. Triggers allow you to schedule the execution of server-side logic or execute it in response to database events. Learn more about what database triggers are.

Tạo bộ sưu tập

Đối với phương pháp này, bạn cần ít nhất hai bộ sưu tập.

Bộ sưu tập đầu tiên sẽ chứa các chi tiết của sinh viên; Do đó chúng tôi sẽ đặt tên cho nó là sinh viên. Chạy lệnh sau để tạo bộ sưu tập sinh viên.students. Run the following command to create a students collection.

db.createCollection("students");

Bộ sưu tập thứ hai sẽ giữ giá trị định danh duy nhất hiện tại cho các sinh viên. Hãy đặt tên cho nó. Chạy lệnh sau để tạo bộ sưu tập bộ đếm.counters. Run the following command to create a counters collection.

db.createCollection("counters");

Tạo kích hoạt

Để thực hiện các trình kích hoạt để tự động nâng, hãy đăng nhập vào tài khoản Atlas MongoDB của bạn, hãy mở cụm bạn muốn làm việc. và nhấp vào kích hoạt. Triggers.

Hướng dẫn auto-increment mongodb - mongodb tự động gia tăng

Nhấp vào Thêm kích hoạt và đặt các giá trị sau vào các trường tương ứng.Add Trigger and set the following values to the corresponding fields.

  • Loại kích hoạt: cơ sở dữ liệu: Database
  • Tên: Auto
    function getNextSequence(name) {
       var ret = db.counters.findAndModify(
              {
                query: { _id: name },
                update: { $inc: { seq: 1 } },
                new: true
              }
       );
    
       return ret.seq;
    }
    4increment
    function getNextSequence(name) {
       var ret = db.counters.findAndModify(
              {
                query: { _id: name },
                update: { $inc: { seq: 1 } },
                new: true
              }
       );
    
       return ret.seq;
    }
    4Trigger
    : Auto
    function getNextSequence(name) {
       var ret = db.counters.findAndModify(
              {
                query: { _id: name },
                update: { $inc: { seq: 1 } },
                new: true
              }
       );
    
       return ret.seq;
    }
    4Increment
    function getNextSequence(name) {
       var ret = db.counters.findAndModify(
              {
                query: { _id: name },
                update: { $inc: { seq: 1 } },
                new: true
              }
       );
    
       return ret.seq;
    }
    4Trigger
  • Đã bật: Bật: ON
  • Sự kiện ghi đè: BẬT: ON
  • Các nguồn dữ liệu liên kết: Các) nguồn dữ liệu: :
  • Tên cụm: :
  • Tên cơ sở dữ liệu ::
  • Tên bộ sưu tập: Học sinh : students
  • Loại hoạt động: Chèn: Insert
  • Tài liệu đầy đủ: Trên : ON
  • Chọn loại sự kiện: Chức năng : Function

Trong trường chức năng, thêm mã sau.

exports = async function(changeEvent) {
    var docId = changeEvent.fullDocument._id;
    
    const countercollection = context.services.get("").db(changeEvent.ns.db).collection("counters");
    const studentcollection = context.services.get("").db(changeEvent.ns.db).collection(changeEvent.ns.coll);
    
    var counter = await countercollection.findOneAndUpdate({_id: changeEvent.ns },{ $inc: { seq_value: 1 }}, { returnNewDocument: true, upsert : true});
    var updateRes = await studentcollection.updateOne({_id : docId},{ $set : {studentId : counter.seq_value}});
    
    console.log(`Updated ${JSON.stringify(changeEvent.ns)} with counter ${counter.seq_value} result : ${JSON.stringify(updateRes)}`);
    };
  • Thay thế
    function getNextSequence(name) {
       var ret = db.counters.findAndModify(
              {
                query: { _id: name },
                update: { $inc: { seq: 1 } },
                new: true
              }
       );
    
       return ret.seq;
    }
    6 bằng tên dịch vụ cụm của bạn.

Mã của bạn sẽ trông như thế này.

Hướng dẫn auto-increment mongodb - mongodb tự động gia tăng

Nhấp vào Lưu để lưu kích hoạt.Save to save the trigger.

Chạy kích hoạt

Trong mã trên, trước tiên chúng tôi đã khởi tạo bộ sưu tập bộ đếm và xác định trình kích hoạt sự kiện chèn cho bộ sưu tập sinh viên. Khi bạn chèn một tài liệu vào bộ sưu tập của sinh viên, hàm kích hoạt sẽ thực thi, cập nhật trường

function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}
7 trong bộ sưu tập bộ đếm và thêm
function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}
7 vào bộ sưu tập của sinh viên dưới dạng trường
function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}
9.counters collection and defined an insert event trigger for the students collection. When you insert a document into the students collection, the trigger function executes, which updates the
function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}
7 field in the counters collection and adds the
function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}
7 to the students collection as
function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}
9 field.

Toán tử MongoDB Inc tăng một trường theo giá trị được chỉ định (1 trong trường hợp của chúng tôi). Tham số returnNewDocument, khi được đặt thành TRUE, trả về một cách nguyên tử, trong khi tham số UPSERT, khi được đặt thành True, thêm một bộ đếm

function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}
9 mới nếu không gian tên hiện tại không có nó.

Để xem kích hoạt trong hành động, hãy chạy các lệnh sau để chèn một vài tài liệu vào bộ sưu tập sinh viên.students collection.

db.students.insert({
   "name":"Jhon Doe"
});
db.students.insert({
   "name":"David Smith"
});
db.students.insert({
    "name":"Amanda Herny"
});

Chạy mã sau để đảm bảo kết quả nhất quán.

function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}
0

Sau khi thực thi mã hoàn tất, bạn sẽ nhận được kết quả sau.

function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}
1

Bạn cũng có thể xem kết quả bằng đồ họa trong Atlas MongoDB bằng cách đi qua bộ sưu tập của sinh viên.students collection.

Hướng dẫn auto-increment mongodb - mongodb tự động gia tăng

Để kiểm tra tài liệu trong bộ sưu tập bộ đếm, hãy chạy mã sau.counters collection, run the following code.

function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}
2

Bạn sẽ nhận được kết quả sau.

function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}
3

Lưu ý giá trị của trường SEQ_VALUE trong bộ sưu tập bộ đếm. Nó đã tăng lên 3 từ 0, vì chúng tôi đã chèn 3 tài liệu vào bộ sưu tập sinh viên.seq_value field in the counters collection. It has increased to 3 from 0, as we have inserted 3 documents into the students collection.

Bản tóm tắt

Mặc dù tự động tăng cường trong MongoDB không phải là một tính năng tiêu chuẩn, bạn vẫn có thể có được kết quả tương tự bằng cách triển khai bộ sưu tập bộ đếm trên trường _ID. Bạn chỉ cần duy trì một bộ sưu tập và tài liệu khác để theo dõi số lượng. Ưu điểm lớn nhất của phương pháp này là nó là trình điều khiển bất khả tri, có nghĩa là bất kỳ khách hàng nào chèn các tài liệu kích hoạt kích hoạt để đặt giá trị bộ đếm chính xác. Nếu bạn muốn tìm hiểu về nhiều cách tiếp cận hơn, hãy đọc blog của chúng tôi về việc tạo số nhận dạng độc đáo trên toàn cầu cho MongoDB.

Câu hỏi thường gặp