Nie jest możliwe do zrobienia rodzaj obliczeń opisujesz z ramami agregacji - i to nie, ponieważ nie ma $unwind
metoda tylko dla tablic. Nawet jeśli obiekty person: value były dokumentami w tablicy, $unwind
nie pomogłoby.
Funkcja "grupuj według" (niezależnie od tego, czy w MongoDB, czy w dowolnej relacyjnej bazie danych) jest wykonywana na wartości pola lub kolumny. Grupujemy według wartości pola i sumy/średniej/etc na podstawie wartości innego pola.
Prosty przykład jest wariantem co proponujesz, oceny pola dodane do przykładowego artykułu kolekcji, ale nie jako mapa z użytkownikiem do rankingu, ale jako tablicę takich jak to:
{ title : title of article", ...
ratings: [
{ voter: "user1", score: 5 },
{ voter: "user2", score: 8 },
{ voter: "user3", score: 7 }
]
}
Teraz można agregacji z tego:
[ {$unwind: "$ratings"},
{$group : {_id : "$ratings.voter", averageScore: {$avg:"$ratings.score"} } }
]
ale ten przykład strukturalnego, jak opisać to będzie wyglądać następująco:
{ title : title of article", ...
ratings: {
user1: 5,
user2: 8,
user3: 7
}
}
lub nawet poniżej:
{ title : title of article", ...
ratings: [
{ user1: 5 },
{ user2: 8 },
{ user3: 7 }
]
}
Nawet jeśli można $unwind
to nie ma nic do agregowania na tutaj. O ile nie znasz kompletnej listy wszystkich możliwych kluczy (użytkowników), nie możesz z tym wiele zrobić. [*]
Analogiczny relacyjnej DB schematu, co masz będzie:
CREATE TABLE T (
user1: integer,
user2: integer,
user3: integer
...
);
To nie jest to, co zrobić, zamiast tego byłoby to zrobić:
CREATE TABLE T (
username: varchar(32),
score: integer
);
a teraz agregować za pomocą SQL:
select username, avg(score) from T group by username;
jest enhan cementowe żądanie dla MongoDB, które może pozwolić ci to zrobić w ramach struktury agregacji w przyszłości - możliwość wyświetlania wartości kluczom na odwrót. Tymczasem zawsze jest mapa/zmniejsz.
[*] Jest to skomplikowany sposób, aby to zrobić, jeśli znasz wszystkie unikalne klucze (możesz znaleźć wszystkie unikalne klucze za pomocą metody podobnej do this), ale jeśli znasz wszystkie klucze, możesz po prostu uruchomić sekwencję zapytań o formularz db.articles.find({"ratings.user1":{$exists:true}},{_id:0,"ratings.user1":1})
dla każdego userX, który zwróci wszystkie swoje oceny i możesz je zsumować i uśrednić po prostu, zamiast wykonywać bardzo złożoną projekcję wymaganą przez strukturę agregacji.
Zamieść js przy odbiorze. –
Biorąc pod uwagę, że to twoja kolekcja (?), Jaka jest agregacja, którą chcesz wykonać, do której potrzebujesz $ unwind? –
Czy to bezpieczne założenie, że liczba "osób" w podtypach genotypów jest zmienna? Nie jestem pewien, dlaczego nie można tworzyć genotypów jako tablicy, btw. –