【问题标题】:MongoDB batch insert not working with java driver 2.11.2MongoDB 批量插入不适用于 java 驱动程序 2.11.2
【发布时间】:2013-11-13 21:00:22
【问题描述】:

MongoDb 2.4.7

mongo-java-driver-2.11.2.jar

Windows 7

所以我试图通过插入一批插入来加载测试 mongodb 来判断它可以处理多少吞吐量。如果一次插入一个就可以了:

...

MongoClient conn = new MongoClient("localhost", 27017);
DB db = conn.getDB( "myDb" );

BasicDBObject jobRecord = new BasicDBObject(...);

DBCollection coll = db.getCollection("myTable");

BasicDBObject finalJobRecord;

for(int i=0;i<100;i++)
{
    finalJobRecord = jobRecord;
    finalJobRecord = finalJobRecord.append("recnum",String.valueOf(i));
    coll.insert(finalJobRecord); 
    finalJobRecord.removeField("_id");// wont work without because of duplicate key errors
}
conn.close();

现在,如果我将其更改为批处理,则它不起作用(重复键异常触发):

...

MongoClient conn = new MongoClient("localhost", 27017);
DB db = conn.getDB( "myDb" );

BasicDBObject jobRecord = new BasicDBObject(...);

DBCollection coll = db.getCollection("myTable");

BasicDBObject finalJobRecord;

List<DBObject> basicDBObjects = new LinkedList<>();

for(int i=0;i<100;i++)
{
    finalJobRecord = jobRecord;
    finalJobRecord = finalJobRecord.append("recnum",String.valueOf(i));
    basicDBObjects.add(finalJobRecord);
}
coll.insert(basicDBObjects);
conn.close();

【问题讨论】:

  • new BasicDBObject(...) 只是字段和值的文档。没错,它应该自动生成_id。我认为它所做的是生成第一个,然后将该 _id 复制到要插入到批处理中的下一个文档。第一个插入有效,批处理中的第二个抛出异常

标签: java mongodb batch-insert


【解决方案1】:

您最终会得到相同对象的列表(所有列表条目都将引用同一个对象),{"recnum" : 99}, 似乎这不是你打算做的。您需要创建新的 BasicDBObject 每次for循环迭代,否则每次迭代都会修改同一个jobRecord。

这同样适用于一对一的方法:您正在观察不同的“recnum”字段,因为对象在修改之前已经插入到 Mongo 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多