MongoDB collection.save()的Java方法

时间:2016-02-15 18:08:00

标签: java mongodb

当我尝试使用自定义_id字段添加文档时,我遇到了使用Java的MongoDB问题。当我向该集合中插入新文档时,如果该文档已经存在,我想忽略该文档。

在Mongo shell中,可以在这种情况下使用collection.save(),但我找不到使用MongoDB java驱动程序的等效方法。

只是添加一个例子:

  • 我有一系列包含网站的文件。信息 将URL作为_id字段(这是唯一的)
  • 我想添加更多文档。在这些新文档中,有些可能存在于当前集合中。所以我想继续添加除了重复文件之外的所有新文件。
  • 这可以通过Mongo Shell中的collection.save()实现,但使用MongoDB Java Driver,我找不到等效的方法。

希望有人可以分享解决方案。提前谢谢!

2 个答案:

答案 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。