我有两份文件:假设为
一个
我的目标是将相应的
我尝试了以下聚合:
但是由于这行代码
如果我执行聚合操作而不进行分组操作,它可以工作,但是对于每个 bar 元素,我都会得到一个 Foo,并且每个 Foo 包含一个不同的 bar 元素,这正是我所期望的,因为我对它们进行了展开。
有办法实现我的目标吗?
Foo
和 Qux
。一个
Foo
文件长这样:{
"_id": ObjectId("5c52bb1af9b7bb512458a6d1"),
"name": "Foo 1",
"description": "This is a Foo",
"bars": [
{
"name": "Bar 1",
"description": "This is a Bar",
"qux": ObjectId("5c3f3d59d45cca2d1860bb4e")
},
{
"name": "Bar 2",
"description": "This is a Bar",
"qux": ObjectId("5c3f3d59d45cca2d1860bb4e")
}
]
}
当一个Qux
看起来像:
{
"_id": ObjectId("5c3f3d59d45cca2d1860bb4e"),
"name": "Qux 1",
"description": "This is a Qux"
}
我的目标是将相应的
Qux
嵌入到 Foo.bars
的每个元素中,如下所示:[{
"_id": ObjectId("5c52bb1af9b7bb512458a6d1"),
"name": "Foo 1",
"description": "This is a Foo",
"bars": [
{
"name": "Bar 1",
"description": "This is a Bar",
"qux": {
"_id": ObjectId("5c3f3d59d45cca2d1860bb4e"),
"name": "Qux 1",
"description": "This is a Qux"
}
},
{
"name": "Bar 2",
"description": "This is a Bar document",
"qux": {
"_id": ObjectId("5c3f3d59d45cca2d1860bb4e"),
"name": "Qux 1",
"description": "This is a Qux"
}
}
]
}]
我尝试了以下聚合:
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(Criteria.where("_id").is(id)),
Aggregation.unwind("bars", true),
Aggregation.lookup("qux", "bars.qux", "_id", "bars.qux"),
Aggregation.project("_id", "name", "description")
.and("bars.qux").arrayElementAt(0).as("bars.qux")
.and("bars.name").as("bars.name")
.and("bars.description").as("bars.description"),
Aggregation.group("_id")
.push("bars").as("bars")
.first("name").as("name")
.first("description").as("description")
);
但是由于这行代码
.push("bars").as("bars")
,它会抛出一个IllegalArgumentException
异常。java.lang.IllegalArgumentException: Invalid reference 'bars'!
at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:100) ~[spring-data-mongodb-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:72) ~[spring-data-mongodb-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.data.mongodb.core.aggregation.GroupOperation.toDocument(GroupOperation.java:421) ~[spring-data-mongodb-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.data.mongodb.core.aggregation.AggregationOperationRenderer.toDocument(AggregationOperationRenderer.java:55) ~[spring-data-mongodb-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.data.mongodb.core.aggregation.Aggregation.toPipeline(Aggregation.java:645) ~[spring-data-mongodb-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.data.mongodb.core.AggregationUtil.createPipeline(AggregationUtil.java:95) ~[spring-data-mongodb-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.data.mongodb.core.MongoTemplate.doAggregate(MongoTemplate.java:2070) ~[spring-data-mongodb-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:2046) ~[spring-data-mongodb-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1945) ~[spring-data-mongodb-2.1.3.RELEASE.jar:2.1.3.RELEASE]
如果我执行聚合操作而不进行分组操作,它可以工作,但是对于每个 bar 元素,我都会得到一个 Foo,并且每个 Foo 包含一个不同的 bar 元素,这正是我所期望的,因为我对它们进行了展开。
[{
"_id": ObjectId("5c52bb1af9b7bb512458a6d1"),
"name": "Foo 1",
"description": "This is a Foo",
"bars": {
"name": "Bar 1",
"description": "This is a Bar",
"qux": {
"_id": ObjectId("5c3f3d59d45cca2d1860bb4e"),
"name": "Qux 1",
"description": "This is a Qux"
}
}
},
{
"_id": ObjectId("5c52bb1af9b7bb512458a6d1"),
"name": "Foo 1",
"description": "This is a Foo",
"bars": {
"name": "Bar 2",
"description": "This is a Bar",
"qux": {
"_id": ObjectId("5c3f3d59d45cca2d1860bb4e"),
"name": "Qux 1",
"description": "This is a Qux"
}
}
}]
有办法实现我的目标吗?