使用MongoDB 3.0 Java驱动聚合框架时如何在$project运算符中使用$substr表达式

How do I use the $substr expression in $project operator when using MongoDB 3.0 Java Driver aggregation framework

我正在尝试将 mongoDB 过程集成到 Java 中,但无法在使用聚合框架的同时将 $expressions 集成到 $project 运算符中。完美工作的 Mongo 查询是:

db.options.aggregate([{$project:{name:1,lastTradeDate:1,month:{$substr:["$lastTradeDate",4,2]}}},{$out:"Books"}])

将其转换为 Java 已将我带到以下(非功能)点:

Document expression = new Document("$substr", new Document("lastTradeDate",new int[] {4,2}));
        AggregateIterable iterable = myDocs.aggregate(asList(
                new Document("$project", new Document("name", 1).append("lastTradeDate", 1).append("month", expression)),
                new Document("$group", new Document("_id", "$contSize").append("count", new Document("$sum", 1))));

所以问题是:如何让 'expression' 真正被识别为 $substr 类型的表达式?

以防有人遇到同样的问题。我发现 Jongo 提供了我所追求的灵活性,而没有必须直接实现它的复杂方法。

生成的 jongo 查询如下所示:

Aggregate.ResultsIterator<JongoDoc> jongoProject = JongoColl.aggregate("{$project:{name:1, smonth:{$substr:['$lastTradeDate',4,2]}}}").and("{$out:'Books'}").as(JongoDoc.class);

对于$project运算符中的$substr,可以通过以下方式形成查询:

在 mongodb 中,考虑一个文档:

{
    "_id" : ObjectId("58a09b076560a311779be35f"),
    "name" : "Helen",
    "date" : "12-04-2015",
    "description" : "Committee head"
}

考虑一下,您只需要从 "date" 字段中投影一天。使用java查询的聚合查询如下:

Document dayExpression = new Document("$substr", Arrays.asList("$date", 0, 2));

AggregateIterable<BasicDBObject> iterable = coll.aggregate(Arrays
                .asList(new Document("$project", new Document("name", 1)
                                .append("description", 1),
                                .append("dayOfDate", dayExpression))));