使用Meteor中的一个调用将多个文档插入mongodb

时间:2016-03-09 13:26:12

标签: mongodb meteor bulkinsert

在mongo shell中,可以insert an array of documents with one call。在Meteor项目中,我尝试过使用

MyCollection = new Mongo.Collection("my_collection")
documentArray = [{"one": 1}, {"two": 2}]
MyCollection.insert(documentArray)

但是,当我从mongo shell中检查my_collection时,它显示只插入了一个文档,并且该文档包含整个数组,就好像它是一个地图一样:

db.my_collection.find({})
{ "_id" : "KPsbjZt5ALZam4MTd", "0" : { "one" : 1 }, "1" : { "two" : 2} }

我是否可以使用Meteor调用同时添加一系列文档,或者必须使用诸如here所述的技术?

我想在一次调用中插入多个文档可以优化客户端的性能,新文档可以一次性使用。

2 个答案:

答案 0 :(得分:4)

您可以使用bulk API在服务器端执行批量插入。使用forEach()方法操作数组,并在循环内使用批量插入操作插入文档,这些操作只是服务器顶部的抽象操作,可以轻松构建批量操作。

注意,对于比2.6更旧的MongoDB服务器,API将下转换操作。但是,不可能将100%下变频,因此可能存在一些无法正确报告正确数字的边缘情况。

您可以通过rawCollection

上的rawDatabaseMongo.Collection方法获取npm MongoDB驱动程序中的集合和数据库对象的原始访问权限
MyCollection = new Mongo.Collection("my_collection");

if (Meteor.isServer) {
    Meteor.startup(function () {
        Meteor.methods({
            insertData: function() {
                var bulkOp = MyCollection.rawCollection().initializeUnorderedBulkOp(),
                    counter = 0,
                    documentArray = [{"one": 1}, {"two": 2}];

                documentArray.forEach(function(data) {
                    bulkOp.insert(data);

                    counter++;
                    // Send to server in batch of 1000 insert operations
                    if (counter % 1000 == 0) {
                        // Execute per 1000 operations and re-initialize every 1000 update statements
                        bulkOp.execute(function(e, rresult) {
                            // do something with result
                        });
                        bulkOp = MyCollection.rawCollection().initializeUnorderedBulkOp();
                    }
                }); 

                // Clean up queues
                if (counter % 1000 != 0){
                    bulkOp.execute(function(e, result) {
                        // do something with result
                    });
                }
            }
        }); 
    });
}

答案 1 :(得分:1)

我目前正在使用mikowals:batch-insert包。

您的代码可以通过一个小的改动来实现:

MyCollection = new Mongo.Collection("my_collection");
documentArray = [{"one": 1}, {"two": 2}];
MyCollection.batchInsert(documentArray);

我注意到的一个缺点就是它不尊重简单模式。