在 Java 驱动程序中为 MongoDB 使用聚合时出现光标错误
Cursor error when using aggregation for MongoDB in Java driver
我想按组聚合,然后排序和限制。这是我的代码:
if(m!=null){
db = m.getDB("FMdb");
DBCollection collection = db.getCollection("user_artists");
DBObject group = new BasicDBObject("$group", new BasicDBObject("_id", "$artistID").append("total", new BasicDBObject("$sum", "$weight")));
DBObject sort = new BasicDBObject("$sort", new BasicDBObject("total", -1));
DBObject limit = new BasicDBObject("$limit", 1);
List<DBObject> pipeline = Arrays.asList(group,sort,limit);
AggregationOutput output = collection.aggregate(pipeline);
for (DBObject d : output.results()){System.out.println(d);}
}
这是来自 bash 的错误消息:
Exception in thread "main" com.mongodb.MongoCommandException: Command failed with error 9: 'The 'cursor' option is required, except for aggregate with the explain argument' on server 127.0.0.1:27017. The full response is { "ok" : 0.0, "errmsg" : "The 'cursor' option is required, except for aggregate with the explain argument", "code" : 9, "codeName" : "FailedToParse" }
所以,我无法编译你的代码,不确定命名空间是什么,而且你没有包含它们。这是一个示例,其中每个对象都是完全限定的。我认为这是你想要的。我相信 objective 是找到拥有最多条目的艺术家并提供该艺术家的条目数...
private static void Aggregate2(com.mongodb.client.MongoDatabase db) {
com.mongodb.client.MongoCollection<org.bson.Document> collection = db.getCollection("user_artists");
com.mongodb.client.AggregateIterable<org.bson.Document> aggregateIterable = collection.aggregate(java.util.Arrays.asList(
com.mongodb.client.model.Aggregates.group("$artistID", com.mongodb.client.model.Accumulators.sum("total", 1)),
new org.bson.Document("$sort", new org.bson.Document("total", -1)),
new org.bson.Document("$limit", 1)
));
for(org.bson.Document document : aggregateIterable) {
String json = document.toJson();
System.out.println(json);
}
}
我在这里发现了很多类似的错误,之前找不到解决办法。结果证明代码本身没问题。问题是 MongoDB 和 java 驱动包不兼容。
我的 MongoDB 版本是 v4.0.9。
我之前的 java-drive 包是 3.0.0-beta1。
将软件包更新到 3.8.0 后,我发布的代码从此完美运行。
如果您遇到类似的错误,您可以在这里找到包。
mongo-java-driver-3.8.0.jar
我想按组聚合,然后排序和限制。这是我的代码:
if(m!=null){
db = m.getDB("FMdb");
DBCollection collection = db.getCollection("user_artists");
DBObject group = new BasicDBObject("$group", new BasicDBObject("_id", "$artistID").append("total", new BasicDBObject("$sum", "$weight")));
DBObject sort = new BasicDBObject("$sort", new BasicDBObject("total", -1));
DBObject limit = new BasicDBObject("$limit", 1);
List<DBObject> pipeline = Arrays.asList(group,sort,limit);
AggregationOutput output = collection.aggregate(pipeline);
for (DBObject d : output.results()){System.out.println(d);}
}
这是来自 bash 的错误消息:
Exception in thread "main" com.mongodb.MongoCommandException: Command failed with error 9: 'The 'cursor' option is required, except for aggregate with the explain argument' on server 127.0.0.1:27017. The full response is { "ok" : 0.0, "errmsg" : "The 'cursor' option is required, except for aggregate with the explain argument", "code" : 9, "codeName" : "FailedToParse" }
所以,我无法编译你的代码,不确定命名空间是什么,而且你没有包含它们。这是一个示例,其中每个对象都是完全限定的。我认为这是你想要的。我相信 objective 是找到拥有最多条目的艺术家并提供该艺术家的条目数...
private static void Aggregate2(com.mongodb.client.MongoDatabase db) {
com.mongodb.client.MongoCollection<org.bson.Document> collection = db.getCollection("user_artists");
com.mongodb.client.AggregateIterable<org.bson.Document> aggregateIterable = collection.aggregate(java.util.Arrays.asList(
com.mongodb.client.model.Aggregates.group("$artistID", com.mongodb.client.model.Accumulators.sum("total", 1)),
new org.bson.Document("$sort", new org.bson.Document("total", -1)),
new org.bson.Document("$limit", 1)
));
for(org.bson.Document document : aggregateIterable) {
String json = document.toJson();
System.out.println(json);
}
}
我在这里发现了很多类似的错误,之前找不到解决办法。结果证明代码本身没问题。问题是 MongoDB 和 java 驱动包不兼容。 我的 MongoDB 版本是 v4.0.9。 我之前的 java-drive 包是 3.0.0-beta1。 将软件包更新到 3.8.0 后,我发布的代码从此完美运行。
如果您遇到类似的错误,您可以在这里找到包。 mongo-java-driver-3.8.0.jar