Use $strLenCP with Spring Data MongoDB

回眸只為那壹抹淺笑 提交于 2020-05-15 09:34:04

问题


I have this mongodb query

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

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).

I tried this

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

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

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

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

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

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

Could someone help please?

Cheers


回答1:


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.

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")
 );



回答2:


You can use expression project(...).and(valueOf("fieldName").lengthCP()).as("fieldLength")




回答3:


@kairius answer isn't clear. This is how it should be done: Use StringOperators#valueOf followed by lengthCP():

TypedAggregation.project()
    .and(StringOperators.valueOf("prefix").lengthCP())
    .as("length")


来源:https://stackoverflow.com/questions/41550451/use-strlencp-with-spring-data-mongodb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!