java - 如何使用双端队列而不是在 MongoDB 中查找进行多重更新?

标签 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:我遇到的障碍是,我无法通过简单的查找/查询来完成,而是需要一个要查询的网址集合(最佳双端队列)。

有什么建议吗?

最佳答案

诚然,我只精通 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 - 在这种情况下您必须进行拆分。

关于java - 如何使用双端队列而不是在 MongoDB 中查找进行多重更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39673474/

相关文章:

java - Groovy 中的静态编译

node.js - 如何在MongoDB中递归遍历嵌套文档

oracle - BULK COLLECT 的奇怪行为

java - JAVA中删除二维TreeMap中的实例

java - 如何模拟对 Junit 内部方法的调用

mongodb - 如何使用代理后面的 Studio 3t 连接到 mongo 服务器?

C# 从多个线程对表执行批量更新,不会出现死锁

mysql - 根据对另一个表的选择结果更新表

java - Java中的循环不遵守条件?

java - Mongodb异常字符串索引超出范围: -1