为什么Spring Data MongoDB在聚合管道中拒绝包含$的字段名?

时间:2019-02-25 14:44:04

标签: java spring mongodb spring-data-mongodb

在使用Spring Data的 ProjectionOperation 类在MongoDB上创建聚合查询时,请使用带有“ $” 的字段(例如'test $ ')字符导致 IllegalArgumentException

验证Spring数据mongodb的源,我注意到在 AggregationField 类的构造函数中,对字段名称进行了清理。 Fields.java Class

private static String cleanUp(String source) {

    if (Aggregation.SystemVariable.isReferingToSystemVariable(source)) {
        return source;
    }

    int dollarIndex = source.lastIndexOf('$');
    return dollarIndex == -1 ? source : source.substring(dollarIndex + 1);
}

MongoDB中字段的命名法会阻止使用“ $”字符,否则这是Spring Data问题?

2 个答案:

答案 0 :(得分:3)

MongoDB官方驱动程序当前不支持的reference documentation clearly states

  

重要

     

MongoDB查询语言不能总是有效地表达对字段名称包含这些字符的文档的查询(请参阅SERVER-30575)。在使用查询语言添加支持之前,请使用$和。建议不要在字段名称中使用“ <”,并且MongoDB官方驱动程序不支持 。   {quote}

即Spring Data无法支持该功能,除非对此提供支持,以使其成为正式的Java驱动程序。

答案 1 :(得分:-1)

这似乎是Spring数据Mongodb的问题...您的字段名应该允许。

  

您可以在字段名称中使用任何(UTF8)字符,这些字符不是很特殊(包含“。”或以“ $”开头)。

来源: SERVER-3229

您可以尝试使用BasicDBObject构建项目操作。这是一个示例:How to use $arrayElemAt operator in Spring Data MongoDB