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

Cách đúng để chèn nhiều bản ghi vào Mongodb với Node.js

Nếu máy chủ MongoDB của bạn là 2.6 hoặc mới hơn, tốt hơn nên tận dụng lợi thế của việc sử dụng lệnh ghi Bulk API cho phép thực hiện các thao tác chèn hàng loạt, đơn giản là các thao tác trừu tượng trên đầu máy chủ để giúp dễ dàng xây dựng các thao tác hàng loạt và do đó nhận được hiệu suất tăng với bản cập nhật của bạn trên các bộ sưu tập lớn.

Gửi các hoạt động chèn hàng loạt theo lô dẫn đến ít lưu lượng truy cập đến máy chủ hơn và do đó thực hiện các giao dịch chuyển khoản hiệu quả bằng cách không gửi tất cả mọi thứ trong các báo cáo riêng lẻ, mà chia thành các phần có thể quản lý cho cam kết của máy chủ. Cũng có ít thời gian hơn để chờ phản hồi trong lệnh gọi lại với cách tiếp cận này.

Các hoạt động hàng loạt này chủ yếu có hai loại:

  • Hoạt động hàng loạt có thứ tự . Các thao tác này thực hiện tất cả các thao tác theo thứ tự và không xảy ra lỗi khi ghi đầu tiên.
  • Hoạt động hàng loạt không có thứ tự . Các hoạt động này thực hiện tất cả các hoạt động song song và tổng hợp tất cả các lỗi. Các hoạt động hàng loạt không theo thứ tự không đảm bảo thứ tự thực hiện.

Lưu ý, đối với các máy chủ cũ hơn 2.6, API sẽ chuyển đổi các hoạt động xuống. Tuy nhiên, không thể downconvert 100% vì vậy có thể có một số trường hợp phức tạp trong đó nó không thể báo cáo chính xác các con số phù hợp.

Trong trường hợp của bạn, bạn có thể triển khai hoạt động chèn Bulk API theo lô 1000 như thế này:

Đối với MongoDB 3.2+ sử dụng bulkWrite

var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects

var createNewEntries = function(db, entries, callback) {

    // Get the collection and bulk api artefacts
    var collection = db.collection('entries'),          
        bulkUpdateOps = [];    

    entries.forEach(function(doc) {
        bulkUpdateOps.push({ "insertOne": { "document": doc } });

        if (bulkUpdateOps.length === 1000) {
            collection.bulkWrite(bulkUpdateOps).then(function(r) {
                // do something with result
            });
            bulkUpdateOps = [];
        }
    })

    if (bulkUpdateOps.length > 0) {
        collection.bulkWrite(bulkUpdateOps).then(function(r) {
            // do something with result
        });
    }
};

Đối với MongoDB <3.2

var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects

var createNewEntries = function(db, entries, callback) {

    // Get the collection and bulk api artefacts
    var collection = db.collection('entries'),          
        bulk = collection.initializeOrderedBulkOp(), // Initialize the Ordered Batch
        counter = 0;    

    // Execute the forEach method, triggers for each entry in the array
    entries.forEach(function(obj) {         

        bulk.insert(obj);           
        counter++;

        if (counter % 1000 == 0 ) {
            // Execute the operation
            bulk.execute(function(err, result) {  
                // re-initialise batch operation           
                bulk = collection.initializeOrderedBulkOp();
                callback();
            });
        }
    });             

    if (counter % 1000 != 0 ){
        bulk.execute(function(err, result) {
            // do something with result 
            callback();             
        }); 
    } 
};

Gọi createNewEntries() chức năng.

MongoClient.connect(url, function(err, db) {
    createNewEntries(db, entries, function() {
        db.close();
    });
});


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Không thể nhận các giá trị thuộc tính dirtyPropertyNames cho các trường liên kết trong grails

  2. Dân cư ở Mongoose

  3. MongoDB - kích thước tệp lớn và ngày càng tăng

  4. Tích hợp mongodb Quarkus

  5. Xử lý việc gửi hai tham số trong một cuộc gọi API trong ứng dụng Angular