如何使用deque而不是MongoDB中的find进行multiupdate?

时间:2016-09-24 06:54:03

标签: java mongodb bulkupdate

我正在尝试重载方法,允许它在一次多次更新中增加多个文档的计数以优化数据库访问。当前(单个更新)方法如下所示:

static synchronized void updateDb(String col, DBObject oldDoc) {
       DBCollection collection = database.getCollection(col);
       BasicDBObject inc = new BasicDBObject().append("$inc", new BasicDBObject().append("count", 1));
       collection.update(new BasicDBObject().append("url",oldDoc.get("url").toString()), inc);
}

现在我已经研究了update multi和bulk.find.update()但还没有找到解决方案。基本上我想将DBObjects的(线程安全的)双端队列移交给新方法,并让DB完成大部分工作。

PS:我遇到的障碍是,我无法通过一个简单的查找/查询,而是有一个集合(最好的双端队列)的网址来查询。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

不可否认,我只精通3.x驱动程序...如果我正确理解你的问题,你想在每个匹配的“url”字段上将计数增加1。使用3.x可以这样做:

    // Input is Collection<DBObject> as variable in

    // New way to get the collection
    MongoClient client = new MongoClient();
    MongoCollection<Document> collection = client.getDatabase("mydb").getCollection("myColl");

    // Prepare list of update URLs
    List<String> urls = in.stream().map(dbObject -> (String) dbObject.get("url")).collect(Collectors.toList());

    // Update many with $in and the same update operation
    collection.updateMany(Filters.in("url", urls), Updates.inc("count", 1));

您还可以检查updateMany返回的更新结果,了解更新文档的数量。

请注意,由于mongo限制,更新列表本身的大小可能不会超过16MB - 在这种情况下你必须拆分。