当我尝试使用自定义_id字段添加文档时,我遇到了使用Java的MongoDB问题。当我向该集合中插入新文档时,如果该文档已经存在,我想忽略该文档。
在Mongo shell中,可以在这种情况下使用collection.save(),但我找不到使用MongoDB java驱动程序的等效方法。
只是添加一个例子:
希望有人可以分享解决方案。提前谢谢!
答案 0 :(得分:1)
在MongoDB Java驱动程序中,您可以尝试将BulkWriteOperation
对象与initializeOrderedBulkOperation()
对象(包含您的集合的对象)的DBCollection
方法一起使用。使用方法如下:
MongoClient mongo = new MongoClient("localhost", port_number);
DB db = mongo.getDB("db_name");
ArrayList<DBObject> objectList; // Fill this list with your objects to insert
BulkWriteOperation operation = col.initializeOrderedBulkOperation();
for (int i = 0; i < objectList.size(); i++) {
operation.insert(objectList.get(i));
}
BulkWriteResult result = operation.execute();
使用此方法,您的文档将一次插入一个,并在每个插入时进行错误处理,因此具有重复ID的文档将像往常一样抛出错误,但操作仍将继续使用其余文档。最后,您可以使用getInsertedCount()
对象的BulkWriteResult
方法来了解实际插入的文档数量。
但是,如果以这种方式插入大量数据,这可能会有点无效。这只是示例代码(在journaldev.com上找到并编辑以适合您的情况。)。您可能需要对其进行编辑,使其适合您当前的配置。它也是未经测试的。
答案 1 :(得分:0)
我猜save
正在做这样的事情。
fun save(doc: Document, col: MongoCollection<Document>) {
if (doc.getObjectId("_id") != null) {
doc.put("_id", ObjectId()) // generate a new id
}
col.replaceOne(Document("_id", doc.getObjectId("_id")), doc)
}
也许他们删除了save
,所以您决定如何生成新ID。