将$ strLenCP与Spring Data MongoDB一起使用

将$ strLenCP与Spring Data MongoDB一起使用

问题描述:

我有这个mongodb查询

I have this mongodb query

db.getCollection('myCollection').aggregate(
    [{
        $project: {
            length: {
                $strLenCP: "$prefix"
            }
        }
    }, {
        $sort: {
            length: -1
        }
    }]
)

我想在Spring Java项目中使用的

但我无法编写正确的Java代码(排序不是问题).

that I want to use into a spring java project but I can't manage to write the correct java code (the sort is not the issue).

我尝试过

Aggregation agg = newAggregation(project().andExpression("strLenCP(prefix)").as("prefixLength"));
AggregationResults < RequestSettingsWithPrefixLength > results = mongoTemplate.aggregate(agg, RequestSettings.class, RequestSettingsWithPrefixLength.class);
List < RequestSettingsWithPrefixLength > requestSettingsList = results.getMappedResults();

但是我在agg JSON(调试模式)中得到了一个空键:

but I am getting a null key in agg JSON (debug mode):

{
    "aggregate": "__collection__",
    "pipeline": [{
        {
            "$project": {
                "prefixLength": {
                    "null": ["$prefix"]
                }
            }
        }]
    }
}

我可以看到我的agg对象具有以下投影操作:

I can see that my agg object has this projection operation:

expression -> strLenCP(prefix)
field -> AggregationField: AggregationField - name: prefixLength,  target: prefixLength, synthetic: true
params -> []

我不确定这是正确的,但是找不到使用strLenCP的任何文档. 我只发现使用strLenCP投影的测试:

I am not sure this is correct but I can't find any documentation that uses strLenCP. I only found this test that uses the strLenCP projection: https://github.com/spring-projects/spring-data-mongodb/blob/dc57b66adfd60b4d69d1d349b4fcfa4ab0da95e7/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SpelExpressionTransformerUnitTests.java#L922

有人可以帮忙吗?

欢呼

在1.10.0.RC1中添加了对Mongo3.4聚合运算符的支持.如果您可以更新以发布候选版本,则一切正常.

The support for Mongo3.4 aggregation operators were added in 1.10.0.RC1. If you are okay with updating to release candidate version everything should just work fine.

或者您可以尝试以下操作,但是您需要使用1.8.5版本.

Or you can try the following but you'll need to use 1.8.5 version.

 Aggregation aggregation = newAggregation(
  project().and(new AggregationExpression() {
      @Override
      public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) {
          return new BasicDBObject("$strLenCP", "$prefix");
      }
  }).as("prefixLength")
 );