【问题标题】:MongoDb Java APi - Ignore errors in bulk importMongoDb Java APi - 忽略批量导入中的错误
【发布时间】:2014-08-15 03:56:31
【问题描述】:

您好,我正在使用此功能将文档导入 mongodb

WriteResult com.mongodb.DBCollection.insert(List<DBObject> list)

一些插入失败是因为数据违反了索引。是否可以忽略这些错误并继续处理其他文档?

Exception in thread "main" com.mongodb.WriteConcernException: { "serverUsed" : "localhost:27017" , "ok" : 1 , "n" : 0 , "err" : "insertDocument :: caused by :: 16755 Can't extract geo keys from object, malformed geometry?: XXXXX , "code" : 16755}
    at com.mongodb.CommandResult.getWriteException(CommandResult.java:90)
    at com.mongodb.CommandResult.getException(CommandResult.java:79)
    at com.mongodb.DBCollectionImpl.translateBulkWriteException(DBCollectionImpl.java:314)
    at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:189)

【问题讨论】:

    标签: mongodb insert bulkinsert


    【解决方案1】:

    什么对我有用:

    wayCollection.insert(ways, new WriteConcern(0, 0, false, false, true));
    

    【讨论】:

    • 这将“工作”。但是通过这种方式插入,你无法知道 MongoDB 是否真的插入了任何东西。
    • 它会比批量方法更快或更慢执行吗?
    • 未确认的写入速度相当快,但我从未比较过批量插入和未确认写入的速度,所以我无法确定。
    【解决方案2】:

    如果您使用的是 MongoDB 2.6+,您可以发送unordered bulk operation。如果在做写操作时出错,MongoDB会继续处理剩余的操作:

    DBCollection coll = db.getCollection("test");
    BulkWriteOperation bulk = coll.initializeUnorderedBulkOperation();
    bulk.insert(new BasicDBObject("foo", 1));
    bulk.insert(new BasicDBObject("bar", 2));
    bulk.execute();
    

    这种方法的缺点是,如果您的插入需要按顺序执行,则不能使用它,但优点是批量插入的执行速度比执行多次插入要快。

    额外的好处是可以从BulkWriteResult 对象(从execute 方法返回)获取插入文档的数量。

    您可以查看用于批量插入的 Java 文档here

    编辑: 为了清楚起见,我不建议您忽略错误,您应该修复您的数据/插入。

    编辑 2 您还可以执行批量操作并为操作设置写入关注点:

    bulk.execute(new WriteConcern(0, 0, false, false, true));
    

    【讨论】:

    • 谢谢,我试试……顺序没关系,你能说我自己的答案是否也正确吗?
    • mh BulkWriteOperation 因同样的异常而失败,我再次尝试使用未确认的写入,因为我知道它最终应该有多少个对象
    • 我可以确认 UnorderedBulkOp 忽略错误并继续在 mongodb 4.4 中执行剩余操作。 .execute() 将只是节点中的一个可以捕获的错误,而我的所有其他插入操作都已完成。使用 OrderedBulkOp 操作在第一个错误后停止。
    猜你喜欢
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2020-09-05
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2012-07-01
    相关资源
    最近更新 更多