Ошибка курсора при использовании агрегации для MongoDB в драйвере Java - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу агрегировать по группам, затем сортировать и ограничивать.Вот мой код:

        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" }

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Я нахожу много подобных ошибок здесь и не мог найти решение раньше.Оказывается, сам код в порядке.Проблема заключается в несовместимости MongoDB и пакета java-drive.Моя версия MongoDB v4.0.9.Мой предыдущий пакет java-drive был 3.0.0-beta1.После обновления пакета до 3.8.0 мои опубликованные коды с тех пор работали отлично.

Если вы столкнулись с подобными ошибками, вы можете найти пакет здесь. Монго-ява-водитель-3.8.0.jar

0 голосов
/ 26 сентября 2019

Итак, я не смог скомпилировать ваш код, не уверен, что такое пространства имен, а вы их не включили.Вот пример, где каждый объект полностью квалифицирован.Я думаю, что это работает, как вы хотите.Я считаю, что цель состоит в том, чтобы найти художника, имеющего наибольшее количество записей, и предоставить количество записей для этого художника ...

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);
    }
}
...