无法使用项目操作创建嵌套对象数组
Cannot create an array of nested object using a project operation
我被迫使用聚合框架和项目操作Spring数据MongoDb.
我想做的是创建一个对象数组作为项目操作的结果。
例如,考虑这个中间聚合结果:
[
{
"content": {
"processes": [
{
"id": "101a",
"title": "delivery"
},
{
"id": "101b",
"title": "feedback"
}
]
}
}
]
我要获取的是:
[
{
"results":
{
"titles": [
{
"id": "101a",
"value": "delivery"
},
{
"id": "101b",
"value": "feedback"
}
]
}
}
]
这只是一个示例,我不想简单地 "rename" 某些字段。
我想要的是创建对象数组的可能性。
如果我尝试这样的事情:
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"]
}
}
}
}
]
使用此投影创建数组,但未创建 "in the proper position"。
但是,如果我使用 nested 运算符,我还没有想出一种方法来指定我想创建一个数组而不是一个对象。
使用此投影:
projectionOperation.and("results.titles")
.nested(
bind("id", "process.id")
.and("value", "process.title")
);
我可以创建适当的嵌套对象,但不能创建到数组中:
"results.titles": {
"id": "101b",
"value": "feedback"
}
您可以尝试下面的聚合代码。
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");
我被迫使用聚合框架和项目操作Spring数据MongoDb.
我想做的是创建一个对象数组作为项目操作的结果。
例如,考虑这个中间聚合结果:
[
{
"content": {
"processes": [
{
"id": "101a",
"title": "delivery"
},
{
"id": "101b",
"title": "feedback"
}
]
}
}
]
我要获取的是:
[
{
"results":
{
"titles": [
{
"id": "101a",
"value": "delivery"
},
{
"id": "101b",
"value": "feedback"
}
]
}
}
]
这只是一个示例,我不想简单地 "rename" 某些字段。 我想要的是创建对象数组的可能性。
如果我尝试这样的事情:
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"]
}
}
}
}
]
使用此投影创建数组,但未创建 "in the proper position"。
但是,如果我使用 nested 运算符,我还没有想出一种方法来指定我想创建一个数组而不是一个对象。 使用此投影:
projectionOperation.and("results.titles")
.nested(
bind("id", "process.id")
.and("value", "process.title")
);
我可以创建适当的嵌套对象,但不能创建到数组中:
"results.titles": {
"id": "101b",
"value": "feedback"
}
您可以尝试下面的聚合代码。
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");