Mam następujący typ dokumentów przechowywanych w kolekcji.Agregacja MongoDB: łącz dwie macierze
{
"_id" : "318036:2014010100",
"data": [
{"flow": [6, 10, 12], "occupancy": [0.0356, 0.06, 0.0856], time: 0},
{"flow": [2, 1, 4], "occupancy": [0.01, 0.0056, 0.0422], time: 30},
...
]
}
chcę obliczyć wartość zagregowaną z pierwszego, drugiego, ..., n-tej wartości w tablicach przepływów i wykorzystania. Kolejność w tablicy powinna zostać zachowana. Zakładając, że chcę obliczyć sumę. Wynik powinien wyglądać następująco:
{
"_id" : "318036:2014010100",
"data": [
{"flow": [6, 10, 12], "occupancy": [0.0356, 0.06, 0.0856], sum: [6.0356, 10.006, 12.00856], time: 0},
{"flow": [2, 1, 4], "occupancy": [0.01, 0.0056, 0.0422], sum: [2.01, 1.0056, 4.0422], time: 30},
...
]
}
starałem się rozwiązać ten problem za pomocą ramy agregacji ale moje obecne podejście nie zachowuje kolejność i produkuje się dużo sum.
db.sens.aggregate([
{$match: {"_id":/^318036:/}},
{$limit: 1},
{$unwind: "$data"},
{$unwind: "$data.flow"},
{$unwind: "$data.occupancy"},
{
$group: {
_id: {id: "$_id", time: "$data.time", o: "$data.occupancy", f: "$data.flow", s: {$add: ["$data.occupancy", "$data.flow"]}}
}
},
{
$group: {
_id: {id: "$_id.id", time: "$_id.time"}, occ: { $addToSet: "$_id.o"}, flow: {$addToSet: "$_id.f"}, speed: {$addToSet: "$_id.s"}
}
}
])
Nie jestem pewien, czy to jest możliwe, aby rozwiązać ten problem z ramami agregacji, a więc rozwiązanie wykorzystujące MapReduce byłoby również w porządku. Jak mogę uzyskać pożądany rezultat?
wierzę to https://jira.mongodb.org/browse/SERVER-5919 uniemożliwia rozwiązanie problemu z ramami agregacji . Z drugiej strony jest to całkowicie możliwe dzięki redukcji mapy. – joao
Jestem osobiście trochę zaskoczony tym, czego oczekujesz od wyniku. "Zestawy" nie są zamawiane. CTO mówi tak samo i jest to zasadniczo ogólna zasada matematyczna. "Podwójna pompa" w '$ group' jej e nie jest konieczna, ponieważ można ją wykonać w jednym etapie. Co w zasadzie sprowadza mnie z powrotem do "tego, co chcesz osiągnąć", biorąc pod uwagę twój pierwotny wkład? Nie wydaje się być jasno określone. –
Nie sądzę, jest sposób to zrobić w ramach agregacji 2.6. Rozważ mapowanie/zmniejszenie lub przetwarzanie po stronie klienta (wstępne). – wdberkeley