Tạo Auto-Increment Field trong MongoDB


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)

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

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:

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)

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

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

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

Kết quả: 

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à:

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.

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.

Nguồn: vinasupport.com

             
SHARE

Bài viết liên quan

mode_edit Bình luận của bạn

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

account_circle
web