我正在尝试将此JavaScript代码转换为要在Spring Data中使用的Java代码:
proj3={"$project": {
"comms" : 1,
"same" : { "$eq" : ["$comms.i" , "$max"]},
"max" : 1,
"_id" : 1
}
};
我似乎无法弄清楚。
我已经试过了:
BasicDBObject o3 = new BasicDBObject();
o3.append("$eq", "[\"$comms.i\",\"$max\"]");
Aggregation aggCount2 = newAggregation(project("comms", "max", "_id").andExpression("same", o3));
logger.info(aggCount2.toString());
这是记录的内容:
{ "$project" : { "comms" : 1 , "max" : 1 , "_id" : 1}}
我也阅读了这个线程:Spring Data MongoDB - $eq within $project support,但是发帖者似乎已经放弃了,而是使用了executeCommand选项,这不是我想走的路线。
如何在Java Spring Data Mongodb中使用此代码?
最佳答案
这就是我解决的方法,它可能不是最有效的方法,但是它似乎不需要重写太多代码就可以工作。
首先,我看了这个线程的答案:
Aggregation Project Group By extracted day, month and year with Spring Data
布雷克斯七世(Blakes Seven)提议我使用特殊的自定义aggregationOperation类,以便聚合代码将使用BasicDBObjects:
public class CustomGroupOperation implements AggregationOperation {
private DBObject operation;
public CustomGroupOperation (DBObject operation) {
this.operation = operation;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return context.getMappedObject(operation);
}
}
接下来,只需将所需的项目代码格式化为BasicDBObject:
BasicDBList basicDBList = new BasicDBList();
basicDBList.add("$comms.i");
basicDBList.add("$max");
Aggregation aggCount2 = newAggregation(
match(),
project(),
group(),
new CustomGroupOperation(new BasicDBObject("$project",
new BasicDBObject("comms", 1)
.append("max", 1)
.append("_id", 1)
.append("same", new BasicDBObject("$eq", basicDBList)))),
match(),
project(),
group(),
sort());
在记录器中将其打印出来,您将看到javascript代码的格式现在是正确的。
{ "$project" : { "comms" : 1 , "max" : 1 , "_id" : 1 , "same" : { "$eq" : [ "$comms.i" , "$max"]}}}
关于java - Spring Data MongoDB:如何在项目聚合查询中表示$ eq?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37643101/