mongodb java驱动程序在组聚合中使用last

时间:2017-11-01 08:05:30

标签: java mongodb aggregation-framework

我的mongodb系列"活动"包括3个字段:数字,日期,类型。我想知道的是有多少"事件"有他们号码的最新日期(我的意思是他们是这个号码最新的事件)并且类型= 3.

我在mongo中的查询正在运行,但我不知道如何使用java驱动程序将其转换为java,因为我不了解Accumulators.last函数的参数是什么(和cann&# 39;找到任何例子!)我知道我可以把它写成字符串,但我更喜欢使用mongodb java驱动程序API。在mongo中,查询是:

db.events.aggregate([ 
  {$sort:{date:1}}, 
  {$group: {
    _id: {"number" : "$number"},
    "recent" : {$last: {action:"$$ROOT.type"}}
  }}, 
  {$match: {"recent.action" : 3}}, 
  {$count: "Qty"} 
],{allowDiskUse: true});

我试着写的是:

Bson stage1 =  Aggregates.sort(Sorts.orderBy(Sorts.ascending("date")));
Bson stage2 = Aggregates.group("$number", Accumulators.last("recent", Accumulators.push("recentEvent", "$$ROOT")));
Bson deleteType = Filters.eq("recent.recentEvent.type", 3);
Bson stage3 = Aggregates.match(deleteType );
Bson stage4 = Aggregates.count("numberOfLastDelete");
pipeline = Arrays.asList(stage1, stage2, stage3, stage4);
result = collection.aggregate(pipeline).allowDiskUse(true).useCursor(true);
Document lastDeleteNumDoc = result.iterator().next();

这不起作用,我在最后一行收到错误:

  

org.bson.codecs.configuration.CodecConfigurationException:无法找到com.mongodb.client.model.BsonField类的编解码器。

如果我没有为该群组使用API​​,则此代码正常运行:

    Bson stage1 =  Aggregates.sort(Sorts.ascending("date"));

    String groupString =
            "{" +
                "$group:" +
                "{" +
                    "_id: \"$number\", " +
                    "\"recent\": { $last: {lastType:\"$$ROOT.type\"} } " +
                "}" +
            "}";


    Bson stage2 = Document.parse(groupString);
    Bson deleteType = Filters.eq("recent.type",3);
    Bson stage3 = Aggregates.match(deleteType );
    Bson stage4 = Aggregates.count("numberOfLastDelete");
    pipeline = Arrays.asList(stage1, stage2, stage3, stage4);
    result = collection.aggregate(pipeline).allowDiskUse(true).useCursor(true);
    Document lastDeleteNumDoc = result.iterator().next();
    Integer lastDeleteNum = lastDeleteNumDoc.getInteger("numberOfLastDelete");

有什么想法吗? 谢谢, Osnat

0 个答案:

没有答案