应用了 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();