我的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