应用了 ConditionalOperators 的项目子文档 - Spring mongo 数据
Project sub document with ConditionalOperators applied - Spring mongo data
聚合 运行 所在的文档具有以下结构。
{
"field1" : "value1",
"field2" : "value2",
"field3" : "value3"
}
以及当前场景的其他不相关字段。注意field1,field2,field3中的值类型都是字符串类型
工作场景:
聚合有一个投影操作,之后最终文档所需的输出结构如下:
{
"field4" : {
"field5" : "value1",
"field6" : "value2",
"field7" : "value3"
}
}
可以通过 mongo Db shell 中的以下查询实现此目的:
db.getCollection("testCollection").aggregate(
[{
"$project": {
"field4": {
"field5": "$field1",
"field6": "$field2",
"field7": "$field3"
}
}
}]
)
在spring数据mongo方面,可以用下面的代码实现:
Aggregation.project()
.nested(Fields.from(Fields.field("field5", "field1"),
Fields.field("field6", "field2"),
Fields.field("field7", "field3")))
问题场景
现在的要求是,如果field1、field2或field3中的任何一个值为null,那么它们将获得一个默认值。
可以通过 mongo Db shell 中的以下查询实现此目的:
db.getCollection("testCollection").aggregate(
[{
"$project": {
"field4": {
"field5": {"$ifNull" :["$field1", ""]},
"field6": {"$ifNull" :["$field2", ""]},
"field7": {"$ifNull" :["$field3", ""]}
}
}
}]
)
但是,当试图在 spring 数据 mongo 方面实现相同时,无法实现相同。
目前尝试过的:
Aggregation.project()
.nested(Fields.from(Fields.field("field5",
ConditionalOperators.ifNull("field1").then(StringUtils.Empty)),
Fields.field("field6", "field2"),
Fields.field("field7", "field3")))
但这会引发错误,指出 Fields.field 的第二个参数应为 java.lang.string 类型,但发现 ConditionalOperators.ifNull。
那么,在 spring 数据 mongo 数据库术语中实现 mongo 数据库查询的正确方法是什么?
当前的 (2.1.x)Spring 数据 MongoDB 并没有很好地支持将表达式投影为嵌套字段。我创建了 DATAMONGO-2353 来改进这一点。
Aggregation.project()
.and((ctx) ->
new Document("field5", ifNull("field1").then("").toDocument(ctx))
.append("field6", ifNull("field2").then("").toDocument(ctx))
).as("field4")
从 Spring 数据 MongoDB 2.2.RC1 开始支持 declarative aggregations,它将本机聚合应用于存储库查询方法。
@Aggregation("{ '$project': { 'field4' : { 'field5' : { '$ifNull' : ... } } } }")
List<DomainType> projectNested();
聚合 运行 所在的文档具有以下结构。
{
"field1" : "value1",
"field2" : "value2",
"field3" : "value3"
}
以及当前场景的其他不相关字段。注意field1,field2,field3中的值类型都是字符串类型
工作场景:
聚合有一个投影操作,之后最终文档所需的输出结构如下:
{
"field4" : {
"field5" : "value1",
"field6" : "value2",
"field7" : "value3"
}
}
可以通过 mongo Db shell 中的以下查询实现此目的:
db.getCollection("testCollection").aggregate(
[{
"$project": {
"field4": {
"field5": "$field1",
"field6": "$field2",
"field7": "$field3"
}
}
}]
)
在spring数据mongo方面,可以用下面的代码实现:
Aggregation.project()
.nested(Fields.from(Fields.field("field5", "field1"),
Fields.field("field6", "field2"),
Fields.field("field7", "field3")))
问题场景
现在的要求是,如果field1、field2或field3中的任何一个值为null,那么它们将获得一个默认值。
可以通过 mongo Db shell 中的以下查询实现此目的:
db.getCollection("testCollection").aggregate(
[{
"$project": {
"field4": {
"field5": {"$ifNull" :["$field1", ""]},
"field6": {"$ifNull" :["$field2", ""]},
"field7": {"$ifNull" :["$field3", ""]}
}
}
}]
)
但是,当试图在 spring 数据 mongo 方面实现相同时,无法实现相同。
目前尝试过的:
Aggregation.project()
.nested(Fields.from(Fields.field("field5",
ConditionalOperators.ifNull("field1").then(StringUtils.Empty)),
Fields.field("field6", "field2"),
Fields.field("field7", "field3")))
但这会引发错误,指出 Fields.field 的第二个参数应为 java.lang.string 类型,但发现 ConditionalOperators.ifNull。
那么,在 spring 数据 mongo 数据库术语中实现 mongo 数据库查询的正确方法是什么?
当前的 (2.1.x)Spring 数据 MongoDB 并没有很好地支持将表达式投影为嵌套字段。我创建了 DATAMONGO-2353 来改进这一点。
Aggregation.project()
.and((ctx) ->
new Document("field5", ifNull("field1").then("").toDocument(ctx))
.append("field6", ifNull("field2").then("").toDocument(ctx))
).as("field4")
从 Spring 数据 MongoDB 2.2.RC1 开始支持 declarative aggregations,它将本机聚合应用于存储库查询方法。
@Aggregation("{ '$project': { 'field4' : { 'field5' : { '$ifNull' : ... } } } }")
List<DomainType> projectNested();