我只是从Python切换,需要继续使用MongoDB数据库。一个特定的任务是将传入的文档(在本例中为推文)保存到集合中以进行存档。推文可以多次出现,所以我更喜欢使用save()
而不是insert()
,因为如果文档已经存在于集合中,前者不会引发错误。但似乎MongoDB的Java驱动程序不支持保存操作。我错过了什么吗?
编辑:供参考,我使用此库'org.mongodb:mongodb-driver:3.0.2'
示例代码:
MongoCollection<Document> tweets = db.getCollection("tweets");
...
Document tweet = (Document) currentDocument.get("tweet");
tweets.insertOne(tweet);
当推文已经存在时,最后一行会引发此错误:
Exception in thread "main" com.mongodb.MongoWriteException: insertDocument :: caused by :: 11000 E11000 duplicate key error index: db.tweets.$_id_ dup key: { : ObjectId('55a403b87f030345e84747eb') }
答案 0 :(得分:6)
使用3.x MongoDB Java驱动程序,您可以使用MongoCollection#replaceOne(Document, Document, UpdateOptions)
,如下所示:
MongoClient mongoClient = ...
MongoDatabase database = mongoClient.getDatabase("myDB");
MongoCollection<Document> tweets = db.getCollection("tweets");
...
Document tweet = (Document) currentDocument.get("tweet");
tweets.replaceOne(tweet, tweet, new UpdateOptions().upsert(true));
这将避免重复键错误。但是,这与使用DBCollection#save(DBObject)
不完全相同,因为它使用整个Document
作为过滤器而不仅仅是_id字段。要镜像旧的保存方法,您必须编写如下内容:
public static void save(MongoCollection<Document> collection, Document document) {
Object id = document.get("_id");
if (id == null) {
collection.insertOne(document);
} else {
collection.replaceOne(eq("_id", id), document, new UpdateOptions().upsert(true));
}
}