如何使用双端队列而不是在 MongoDB 中查找进行多重更新?
How to multiupdate using a deque instead of find in MongoDB?
我正在尝试重载一个方法,允许它在一个多更新中增加多个文档的数量以优化数据库访问。当前(单次更新)方法如下所示:
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:我遇到的问题是,我不能用简单的 find/query 来解决问题,而是有一个要查询的 url 集合(最佳双端队列)。
有什么建议吗?
诚然,我只精通 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 - 在这种情况下您必须拆分。
我正在尝试重载一个方法,允许它在一个多更新中增加多个文档的数量以优化数据库访问。当前(单次更新)方法如下所示:
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:我遇到的问题是,我不能用简单的 find/query 来解决问题,而是有一个要查询的 url 集合(最佳双端队列)。
有什么建议吗?
诚然,我只精通 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 - 在这种情况下您必须拆分。