у меня есть мон go документов, таких как:
{
"id_" : ...,
"company" "AAA":,
"userId" : 80081624,
"features" : [
{
"id" : 1,
"nombre" : "size",
"normal" : 1, (1 or 0)
"alt" : 0, (1 or 0)
},
...
,{
"id" : 8,
"nombre" : "name",
"normal" : 0, (1 or 0)
"alt" : 1, (1 or 0)
}
]
},
{
"id_" : ...,
"company" "BBB":,
"userId" : 8008555,
"features" : [
{
"id" : 1,
"name" : "yyyy",
"normal" : 0, (1 or 0)
"alt" : 1, (1 or 0)
},
{...},{...}
]
}
И я хотел бы иметь возможность группировать их по компаниям и получать процент от "нормального" или "альт" для них. На данный момент мой код выглядит следующим образом:
collection.aggregate(
Arrays.asList(
Aggregates.unwind("$inductores"),
Aggregates.group("$features.id",
Accumulators.avg("n","$features.normal"),
Accumulators.avg("alt","$features.alt")),
Aggregates.sort(ascending("_id")),
Aggregates.project(new org.bson.Document("id","$features.id")
.append("n","$n")
.append("alt","$alt"))
)
).forEach(printBlock);
И это показывает мне оболочкой:
{"_id": 1, "n": 1.0, "alt": 0.0}
{"_id": 8, "n": 0.7, "alt": 0.0}
{....}
Но я хотел бы показать мне это:
{
"_id" : ObjectId("5e45056845b5da211aa04ec4"),
"company" : "BBB",
"features" : [
{
"id" : 1,
"name" : "yyy",
"normal" : “20%”,
"alt" : “45%”
},
{...}
,{
"id" : 3,
"nombre" : "XXX",
"normal" : “10%”,
"alt" : “20%”
}
]
},
{...}
Сначала я попробовал несколько способов сгруппировать компании, но не смог получить результаты.
edit: я получил команду на языке mon go, мне нужно было бы только перевести ее на java но это невозможно для меня. Я использую версию драйвера 3.12
db.collection.aggregate([
{"$unwind":"$feature"},
{
$group: { "_id": {"company" :"$company", "name":"$feature.name", "Id":"$feature.id"},
"n" : {"$sum":"$feature.normal"},
"a1" : {"$sum":"$feature.alterado1"},
}
},
{$sort: {"_id.Id": 1}},
{
$project: {
"name":"$feature.name",
"normal": $concat: [{ $toString: { "$round": [ { "$multiply": [ { "$divide": [100,{"$sum":["$n","$a"]}]}, "$n"]},2] }}," %"],
"alt": $concat: [{ $toString: { "$round": [ { "$multiply": [ { "$divide": [100,{"$sum":["$n","$a"]}]}, "$a"]},2] }}," %"],
}
},
{ $group : {
_id : "$_id.company",
feature: {
$push: {
id:"$_id.Id",
name:"$_id.name",
Normal:"$normal",
Alterate: "$alt"
}
}
}
},
],{ allowDiskUse: true }
).pretty();