MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mongo tìm và cập nhật hàng loạt trường tài liệu phù hợp trong một truy vấn?

Để cải thiện hiệu suất, hãy tận dụng lợi thế của việc sử dụng Bulk() API để cập nhật hàng loạt bộ sưu tập một cách hiệu quả vì bạn sẽ gửi các hoạt động đến máy chủ theo lô (ví dụ:kích thước lô là 500). Điều này mang lại cho bạn hiệu suất tốt hơn nhiều vì bạn sẽ không gửi mọi yêu cầu đến máy chủ mà chỉ gửi một lần trong mỗi 500 yêu cầu, do đó làm cho các bản cập nhật của bạn hiệu quả hơn và nhanh hơn.

Phần sau minh họa cách tiếp cận này, ví dụ đầu tiên sử dụng Bulk() API có sẵn trong các phiên bản MongoDB> =2.6 và <3.2. Nó cập nhật tất cả các tài liệu phù hợp trong bộ sưu tập từ một mảng nhất định bằng cách tăng 1 cho trường được hiển thị. Nó giả định rằng mảng hình ảnh có cấu trúc

var images = [
    { "_id": 1, "name": "img_1.png" },
    { "_id": 2, "name": "img_2.png" }
    { "_id": 3, "name": "img_3.png" },
    ...
    { "_id": n, "name": "img_n.png" }
]

Phiên bản MongoDB> =2.6 và <3.2 :

var bulk = db.images.initializeUnorderedBulkOp(),
    counter = 0;

images.forEach(function (doc) {    
    bulk.find({ "_id": doc._id }).updateOne({ 
        "$inc": { "shown": 1 }
    });

    counter++;
    if (counter % 500 === 0) {
        // Execute per 500 operations
        bulk.execute(); 
        // re-initialize every 500 update statements
        bulk = db.images.initializeUnorderedBulkOp();
    }
})
// Clean up remaining queue
if (counter % 500 !== 0) { bulk.execute(); }

Ví dụ tiếp theo áp dụng cho phiên bản MongoDB 3.2 mới mà từ đó không dùng nữa Bulk() API và cung cấp một bộ apis mới hơn bằng cách sử dụng bulkWrite() .

MongoDB phiên bản 3.2 trở lên :

var ops = [];
images.forEach(function(doc) {
    ops.push({
        "updateOne": {
            "filter": { "_id": doc._id },
            "update": {
                "$inc": { "shown": 1 }
            }
        }
    });

    if (ops.length === 500 ) {
        db.images.bulkWrite(ops);
        ops = [];
    }
})

if (ops.length > 0)  
    db.images.bulkWrite(ops);



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB với redis

  2. MongoDB - Đối số cho $ size phải là một Mảng, nhưng thuộc loại:EOO / thiếu

  3. Cách chèn nhiều mục cùng lúc trong bộ sưu tập MongoDB

  4. Tải lên và truy xuất tệp bằng MongoDB và Spring Boot

  5. Mongo sắp xếp theo một điều kiện được tính toán