系统在DB中具有以下文档信息:
{
"systemName": "ABC",
"systemUsageAttrs" : [
{
"cpuUsage": 30,
"memUsage": 40,
"isActive": false
},
{
"cpuUsage": 88.2,
"memUsage": 33.5,
"isActive": false
},
{
"cpuUsage": 66.3,
"memUsage": 79.5,
"isActive": true
},
{
"cpuUsage": 80.5,
"memUsage": 63,
"isActive": true
}
]
}
我尝试使用mongo java驱动程序进行仲裁,以下是以下代码段:
List<Document> systemDetailsAL = sysUsageDetailsColl.aggregate(
asList(
match(eq("systemName","ABC")),
unwind("$systemUsageAttrs"),
match(eq("systemUsageAttrs.isAcive",true)),
group("$_id", Accumulators.push("systemName","$systemName"),
Accumulators.push("systemUsageAttrs", "$systemUsageAttrs")),
project(Projections.fields(Projections.excludeId(),
Projections.include("systemName", "systemUsageAttrs")))
)
).into(new ArrayList<Document>());
以上提供了具有两个元素的ArrayList的输出,第0个元素的文档具有键“ systemName”,而值是具有两个元素的ArrayList。 第一个位置元素是Document的键为“ systemUsageAttrs”,值是ArrayList,其中包含两个元素,即所有系统使用情况详细信息。
尝试尝试的另一种方法是将上面的代码整理成组部分,因此它为我提供了2个文档的列表
{
serverName: ABC,
systemUsageAttr: {
cpuUSage: xxx,
memUsage: yyy,
isActive:true
}}
和第二份文件
{
serverName: ABC,
systemUsageAttr: {
cpuUSage: ttt,
memUsage: sss,
isActive:true
}}
是否可以使用聚合返回仅包含1个元素的列表,例如下面的输出
{
serverName: ABC,
systemUsageAttr: [
{
cpuUSage: xxx,
memUsage: yyy,
isActive:true
},
{
cpuUSage: ttt,
memUsage: sss,
isActive:true
}
}
感谢任何帮助或指点。
答案 0 :(得分:1)
更改这两个阶段:
group("$_id", Accumulators.push("systemName","$systemName"),
Accumulators.push("systemUsageAttrs", "$systemUsageAttrs")),
project(Projections.fields(Projections.excludeId(),
Projections.include("systemName", "systemUsageAttrs")))
)
如下所示,以获得所需的结果:
group("$_id", Accumulators.push("systemUsageAttrs", "$systemUsageAttrs"),
Accumulators.first("systemName", "$systemName")),
project(Projections.excludeId()))
请注意Accumulators.first
($first组聚合运算符)的用法。