无法使用项目操作创建嵌套对象的数组

时间:2018-08-17 09:14:53

标签: mongodb spring-boot spring-data aggregation-framework spring-data-mongodb

我被迫使用聚合框架和 Spring Data MongoDb 项目操作。

我想做的是通过项目操作来创建对象数组。

例如,考虑以下中间聚合结果:

[
  {
    "content": {
      "processes": [
        {
          "id": "101a",
          "title": "delivery"
        },
        {
          "id": "101b",
          "title": "feedback"
        }
      ]
    }
  }
]

我想获得的是这样的:

[  
  {
    "results":
    {
      "titles": [
        {
          "id": "101a",
          "value": "delivery"
        },
        {
          "id": "101b",
          "value": "feedback"
        }
      ]
    }
  }
]

这只是一个例子,我不想简单地“重命名”某些字段。 我想要的是创建对象数组的可能性。

如果我尝试这样的事情:

   projectionOperation
     .and("$content.processes.id").as("results.titles.id")
     .and("$content.processes.title").as("results.titles.value");

我得到这个:

[  
  {
    "results":
    {
      "titles": {
          "id": ["101a", "101b"]
          "value": ["delivery", "feedback"]
        }
      }
    }
  }
]

使用此投影,将创建数组,但不会“处于适当位置”。

但是,如果使用 nested 运算符,则还没有找到一种方法指定我要创建数组而不是对象。 如此预测:

projectionOperation.and("results.titles")
         .nested(
              bind("id", "process.id")
                 .and("value", "process.title")
         );

我可以创建一个适当的嵌套对象,但不能创建一个数组:

"results.titles": {
            "id": "101b",
            "value": "feedback"
        }

1 个答案:

答案 0 :(得分:2)

您可以尝试以下聚合代码。

ProjectionOperation po = Aggregation.project().and(
   VariableOperators.mapItemsOf("content.processes").as("rt")
    .andApply(
      new AggregationExpression() {
       @Override
       public Document toDocument(AggregationOperationContext aggregationOperationContext) {
             return new Document("id", "$$rt.id").append("value", "$$rt.title");
       }
    } 
  )
).as("result");