Latest Post

Tăng thứ hạng và truy cập tự nhiên với 10 phương pháp SEO hay nhất Kiếm Tiền Online (mmo): Khái Niệm và Các Hình Thức Phổ Biến

Trái ngược với một số Hệ quản trị CSDL khác như MySQL, PostgreSQL, MongoDB không hỗ trợ Auto-Increment. Trong MongoDB, mỗi khi bạn thêm một bản ghi vào cơ sở dữ liệu, nó sẽ được gán một Object ID riêng biệt với các ký tự ngẫu nhiên hoặc theo một quy tắc cụ thể 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ả: 

Lưu ý: Để tạo một trường tự tăng (Auto-Increment) cho một bảng khác, chẳng hạn như bảng “products”, chúng ta cần thêm một bản ghi vào bảng “counters” với trường _id: “productid”, sau đó thêm dữ liệu cho bảng “products” như sau:

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.

Trả lời

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 *