MongoDB - Trình tự tăng dần tự động
MongoDB không có chức năng tự động tăng dần, giống như cơ sở dữ liệu SQL. Theo mặc định, nó sử dụng ObjectId 12 byte cho_idlàm khóa chính để xác định duy nhất các tài liệu. Tuy nhiên, có thể có những trường hợp mà chúng ta có thể muốn trường _id có một số giá trị tự động tăng lên khác với ObjectId.
Vì đây không phải là tính năng mặc định trong MongoDB, chúng tôi sẽ đạt được chức năng này theo chương trình bằng cách sử dụng counters bộ sưu tập theo gợi ý của tài liệu MongoDB.
Sử dụng Bộ sưu tập Bộ đếm
Hãy xem xét những điều sau productstài liệu. Chúng tôi muốn trường _id là mộtauto-incremented integer sequence bắt đầu từ 1,2,3,4 tối đa n.
{
"_id":1,
"product_name": "Apple iPhone",
"category": "mobiles"
}
Đối với điều này, hãy tạo counters tập hợp, sẽ theo dõi giá trị trình tự cuối cùng cho tất cả các trường trình tự.
>db.createCollection("counters")
Bây giờ, chúng tôi sẽ chèn tài liệu sau vào bộ sưu tập bộ đếm với productid như chìa khóa của nó -
> db.counters.insert({
"_id":"productid",
"sequence_value": 0
})
WriteResult({ "nInserted" : 1 })
>
Cánh đồng sequence_value theo dõi giá trị cuối cùng của dãy số.
Sử dụng mã sau để chèn tài liệu trình tự này vào bộ sưu tập bộ đếm -
>db.counters.insert({_id:"productid",sequence_value:0})
Tạo hàm Javascript
Bây giờ, chúng ta sẽ tạo một hàm getNextSequenceValuesẽ lấy tên chuỗi làm đầu vào của nó, tăng số thứ tự lên 1 và trả về số thứ tự đã cập nhật. Trong trường hợp của chúng tôi, tên chuỗi làproductid.
>function getNextSequenceValue(sequenceName){
var sequenceDocument = db.counters.findAndModify({
query:{_id: sequenceName },
update: {$inc:{sequence_value:1}},
new:true
});
return sequenceDocument.sequence_value;
}
Sử dụng hàm Javascript
Bây giờ chúng ta sẽ sử dụng hàm getNextSequenceValue trong khi tạo tài liệu mới và gán giá trị trình tự được trả về dưới dạng trường _id của tài liệu.
Chèn hai tài liệu mẫu bằng đoạn mã sau:
>db.products.insert({
"_id":getNextSequenceValue("productid"),
"product_name":"Apple iPhone",
"category":"mobiles"
})
>db.products.insert({
"_id":getNextSequenceValue("productid"),
"product_name":"Samsung S3",
"category":"mobiles"
})
Như bạn thấy, chúng ta đã sử dụng hàm getNextSequenceValue để đặt giá trị cho trường _id.
Để xác minh chức năng, hãy để chúng tôi tìm nạp tài liệu bằng lệnh find -
>db.products.find()
Truy vấn trên trả về các tài liệu sau có trường _id tăng dần -
{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }