почему драйвер mongo-java-driver 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#aggregate-java.util.List-

Итак, я предполагаю, что драйвер выдает бесполезное исключение, и здесь происходит что-то еще.

Я протестировал запрос, который я запускаю, и он хорошо работает из оболочки mongo. Это выглядит так:

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

Итак, я не уверен, почему возникает это исключение или как его исправить.


person Alex Ryan    schedule 25.03.2015    source источник
comment
Попробуйте запустить с параметром -verbose:class VM, чтобы определить, откуда загружается DBCollection.   -  person jyemin    schedule 26.03.2015
comment
Вот оно. Грасиас.   -  person Alex Ryan    schedule 26.03.2015


Ответы (2)


Похоже, это может быть ошибка в драйвере. Или может я неправильно его использую?

Когда я использовал старую устаревшую версию агрегатного метода, она работала.

  AggregationOutput output = this.collection.aggregate(match, group, sort);
person Alex Ryan    schedule 25.03.2015

Попробуйте более старую версию jar mongo-java-driver, т.е. 2.11.4, чтобы решить проблему. Вот ссылка для загрузки jar.

person Ratnesh Kushwaha    schedule 19.10.2016