当前位置: 首页 > 知识库问答 >
问题:

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

朱硕
2023-03-14

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

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

我验证了我的代码实际上是像这样调用该版本的驱动程序:

代码:

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

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

共有1个答案

百里光熙
2023-03-14

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

当我使用聚合方法的旧的不推荐版本时,它起作用了。

  AggregationOutput output = this.collection.aggregate(match, group, sort);
 类似资料:
  • 我正在搜索文档中的contacts数组中包含特定_ID的文档。下面是结构: 它执行与$elemmatch查询相同的操作。 我可能错过了一些非常基本的东西,但如果你们能提供一些建议,我将非常感谢。

  • 问题内容: 在下面的程序中,你可以看到.5除以外的每个值都略小于四舍五入的值0.5。 版画 我正在使用Java 6 update 31。 问题答案: 摘要 在Java 6(可能更早)中,实现为。1 这是一个规范错误,恰恰是这种病理情况。2 Java 7不再强制执行此无效的实现。3 问题 0.5 + 0.499999999999999999994的双精度正好为1: 这是因为0.49999999999

  • 问题内容: 为什么此代码有时返回1E + 1,而对于其他输入(例如17)却没有以科学计数法打印输出? 问题答案: 使用bigDecimal.toPlainString(): 输出:

  • 问题内容: 即使正则表达式应返回true,程序也不会退出。代码有什么问题? 问题答案: 仅当整个字符串与正则表达式匹配时才返回。在你的情况下,你的正则表达式仅代表 一个 字符不是,或。 我怀疑您要检查字符串是否包含您在正则表达式中描述的这些特殊字符之一。在这种情况下,请将您的正则表达式括起来,以使正则表达式匹配整个字符串。哦,您不必逃脱character class内部。

  • 问题内容: 这是简单的代码,我没有得到设置位图的结果,而是得到了null。谁能告诉我我在哪里犯错了? 更新 好的,所以我无法像我想的那样将文本转换为图像。这样呢 这会创建位图吗? 问题答案: 从文档中: 返回 解码的位图;如果无法解码图像,则 返回 null。 字符串“ test”中涉及的字节不是有效的位图,对吗? 如果将文本“ test”保存在名为or 等的文件中,并试图在Windows中打开它

  • 问题内容: 为什么要用Python返回? 我如何获得改组后的值而不是? 问题答案: 更改列表 到位 。 在原位更改结构的Python API方法通常返回,而不是修改后的数据结构。 如果要基于现有列表创建 新的 随机混排列表,并按顺序保留现有列表,则可以使用输入的完整长度: 您还可以将with用于排序键: 但这会调用排序(O(NlogN)操作),而采样到输入长度仅需要O(N)操作(与所使用的过程相同