Почему mongo-java-драйвер DBCollection.aggregate() возвращает NoSuchMethod
Вот часть трассировки стека, которую я получаю, когда я вызываю агрегатный метод объекта DBCollection mongodb:
java.lang.NoSuchMethodError: com.mongodb.DBCollection.aggregate(Ljava/util/List;)Lcom/mongodb/AggregationOutput;
at com.alpine.dao.AppEventDAO.getActiveDeviceIds(AppEventDAO.java:975)
at sonomaLoggerTest.AppEventDAO_getActiveDeviceIds.test(AppEventDAO
Я не понимаю, почему я получаю эту ошибку и как ее устранить.
Первое, что пришло в голову - возможно, у меня есть старая версия драйвера на моем пути, которая не поддерживает этот метод?
Я удалил все старые версии драйвера и использовал только версию 2.13.0.
Я подтвердил, что мой код на самом деле вызывает эту версию драйвера следующим образом:
Код:
logger.debug("major version: " + Mongo.MAJOR_VERSION);
logger.debug("minor version: " + Mongo.MINOR_VERSION);
Выход:
2015-03-25 15:50:58,242 DEBUG: AppEventDAO.java:972: major version: 2
2015-03-25 15:50:58,243 DEBUG: AppEventDAO.java:973: minor version: 13
Эта версия драйвера должна поддерживать этот метод: http://api.mongodb.org/java/2.13/com/mongodb/DBCollection.html
Итак, я предполагаю, что водитель выбрасывает бесполезное исключение, и здесь происходит что-то еще.
Я проверил запрос, который я выполняю, и он хорошо работает из оболочки Монго. Это выглядит так:
db.event.aggregate([
{ "$match" : { "$and" : [ { "time" : { "$gte" : 1426834800}} , { "time" : { "$lt" : 1427353200}} , { "type" : "SONG_PLAY_STARTED"}]}},
{ "$group" : { "_id" : "$device.id" , "count" : { "$sum" : 1}}},
{ "$sort" : { "count" : -1}}
])
Это возвращает результаты как это:
{ "_id" : "D44A4299A9594FCFBE05CE8FB93F6826", "count" : 79 }
{ "_id" : "8E653C9D8E87452199DAA2BB9D908AEA", "count" : 40 }
{ "_id" : "C74CE4D520034020B4C353235F1AFBC0", "count" : 27 }
{ "_id" : "E245CEFACBC84604AF904BD8DE4D045D", "count" : 27 }
{ "_id" : "2D8C085876AB4FE39B18DC9382975238", "count" : 25 }
{ "_id" : "43466F0F8BD542EFA2CECA3B2997C997", "count" : 23 }
{ "_id" : "389A389EE003455994941429973A81FE", "count" : 20 }
{ "_id" : "9A76A14E7308440D8F1108052787A409", "count" : 12 }
{ "_id" : "4B8126E9587D475C8934C20FCBF4D7DB", "count" : 11 }
{ "_id" : "393FFE19397D4586AD6950C2264A087A", "count" : 10 }
Вот код Java, который я использую для выполнения того же запроса через драйвер Java:
DBObject clause1 = new BasicDBObject("time", new BasicDBObject("$gte", startTime));
DBObject clause2 = new BasicDBObject("time", new BasicDBObject("$lt", endTime));
DBObject clause3 = new BasicDBObject("type", "SONG_PLAY_STARTED");
BasicDBList andClauses = new BasicDBList();
andClauses.add(clause1);
andClauses.add(clause2);
if (excludeNoSongsPlayed) {
andClauses.add(clause3);
}
BasicDBObject and = new BasicDBObject("$and", andClauses);
DBObject match = new BasicDBObject("$match", and);
DBObject groupFields = new BasicDBObject( "_id", "$device.id");
groupFields.put("count", new BasicDBObject( "$sum", 1));
DBObject group = new BasicDBObject("$group", groupFields);
// Finally the $sort operation
DBObject sort = new BasicDBObject("$sort", new BasicDBObject("count", -1));
logger.debug("match=|" + match + "|");
logger.debug("group=|" + group + "|");
logger.debug("sort=|" + sort + "|");
List<DBObject> pipeline = Arrays.asList(match, group, sort);
logger.debug("major version: " + Mongo.MAJOR_VERSION);
logger.debug("minor version: " + Mongo.MINOR_VERSION);
AggregationOutput output = this.collection.aggregate(pipeline);
Я подтвердил, что запрос в коде java соответствует запросу, который я запускаю в оболочке mongo, с операторами отладки:
2015-03-25 15:50:58,238 DEBUG: AppEventDAO.java:958: match=|{ "$match" : { "$and" : [ { "time" : { "$gte" : 1426834800}} , { "time" : { "$lt" : 1427353200}} , { "type" : "SONG_PLAY_STARTED"}]}}|
2015-03-25 15:50:58,239 DEBUG: AppEventDAO.java:959: group=|{ "$group" : { "_id" : "$device.id" , "count" : { "$sum" : 1}}}|
2015-03-25 15:50:58,242 DEBUG: AppEventDAO.java:960: sort=|{ "$sort" : { "count" : -1}}|
Поэтому я не уверен, почему возникает это исключение или как его исправить.
2 ответа
Попробуйте более старую версию mongo-java-driver jar, т.е. 2.11.4, чтобы решить проблему. Вот ссылка на скачивание банку.
Похоже, это может быть ошибка в драйвере. Или, возможно, я использую это неправильно?
Когда я использовал старую устаревшую версию агрегатного метода, это работало.
AggregationOutput output = this.collection.aggregate(match, group, sort);