首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么mongo-java-driver DBCollection.aggregate()返回NoSuchMethod

为什么mongo-java-driver DBCollection.aggregate()返回NoSuchMethod
EN

Stack Overflow用户
提问于 2015-03-26 07:19:52
回答 2查看 1.7K关注 0票数 0

下面是我在mongodb的DBCollection对象上调用aggregate方法时得到的堆栈跟踪的一部分:

代码语言:javascript
复制
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版。

我验证了我的代码实际上是在调用该版本的驱动程序,如下所示:

代码:

代码语言:javascript
复制
  logger.debug("major version: " + Mongo.MAJOR_VERSION);
  logger.debug("minor version: " + Mongo.MINOR_VERSION);

输出:

代码语言:javascript
复制
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 shell中工作得很好。它看起来是这样的:

代码语言:javascript
复制
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}}  
])

它返回如下结果:

代码语言:javascript
复制
  { "_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代码:

代码语言:javascript
复制
  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 shell中运行的查询与调试语句相匹配:

代码语言:javascript
复制
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}}|

所以,我不确定为什么会引发这个异常,也不知道如何修复它。

EN

回答 2

Stack Overflow用户

发布于 2015-03-26 07:31:31

看起来这可能是驱动程序中的错误。或者可能是我用错了?

当我使用旧版本的aggregate方法时,它起作用了。

代码语言:javascript
复制
  AggregationOutput output = this.collection.aggregate(match, group, sort);
票数 0
EN

Stack Overflow用户

发布于 2016-10-19 15:10:14

尝试使用旧版本的mongo-java-driver jar,例如2.11.4来解决这个问题。这是下载jar的a link

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29268355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档