【发布时间】:2019-05-28 06:26:04
【问题描述】:
我在 MongoDB 中有一个文档,如下所示。
{
"_id" : ObjectId("5ceb812b3ec6d22cb94c82ca"),
"key" : "KEYCODE001",
"values" : [
{
"classId" : "CLASS_01",
"objects" : [
{
"code" : "DD0001"
},
{
"code" : "DD0010"
}
]
},
{
"classId" : "CLASS_02",
"objects" : [
{
"code" : "AD0001"
}
]
}
]
}
我有兴趣获得如下结果。
{
"classId" : "CLASS_01",
"objects" : [
{
"code" : "DD0001"
},
{
"code" : "DD0010"
}
]
}
为此,我在 Robo 3T 中提出了一个聚合管道,如下所示。它按预期工作。
[
{
$match:{
'key':'KEYCODE001'
}
},
{
"$unwind":{
"path": "$values",
"preserveNullAndEmptyArrays": true
}
},
{
"$unwind":{
"path": "$values.objects",
"preserveNullAndEmptyArrays": true
}
},
{
$match:{
'values.classId':'CLASS_01'
}
},
{
$project:{
'object':'$values.objects',
'classId':'$values.classId'
}
},
{
$group:{
'_id':'$classId',
'objects':{
$push:'$object'
}
}
},
{
$project:{
'_id':0,
'classId':'$_id',
'objects':'$$objects'
}
}
]
现在,当我尝试在 SpringBoot 应用程序中执行相同操作时,我无法让它运行。我最终遇到了错误java.lang.IllegalArgumentException: Invalid reference '$complication'!。以下是我迄今为止在 Java 中所做的。
final Aggregation aggregation = newAggregation(
match(Criteria.where("key").is("KEYCODE001")),
unwind("$values", true),
unwind("$values.objects", true),
match(Criteria.where("classId").is("CLASS_01")),
project().and("$values.classId").as("classId").and("$values.objects").as("object"),
group("classId", "objects").push("$object").as("objects").first("$classId").as("_id"),
project().and("$_id").as("classId").and("$objects").as("objects")
);
我做错了什么?经过研究,我发现组中的多个字段不起作用或类似的东西(请参阅this question)。那么,我目前在 Spring Boot 中所做的事情是否可行?
【问题讨论】:
标签: java spring mongodb group-by aggregate