Zakładając Mam kolekcję o nazwie „posty” (w rzeczywistości jest to bardziej skomplikowane kolekcja, słupki jest zbyt proste) o następującej strukturze:
> db.posts.find()
{ "id" : ObjectId("50ad8d451d41c8fc58000003"), "title" : "Lorem ipsum", "author" :
"John Doe", "content" : "This is the content", "tags" : [ "SOME", "RANDOM", "TAGS" ] }
spodziewam tej kolekcji na setki tysięcy, być może miliony, które muszę wysłać do postów według tagów i pogrupować wyniki według tagów i wyświetlić stronę w paginacji. To jest, gdy ramy agregacja przychodzi Planuję użyć metody agregat() do kwerendy kolekcji:.
db.posts.aggregate(
{ "unwind" : "$tags" },
{ "group" : {
_id: { tag: "$tags" },
count: { $sum: 1 }
} }
);
Połów jest, że aby stworzyć paginator chciałbym wiedzieć długość tablicy wyjściowej. Wiem, że to zrobić:
db.posts.aggregate(
{ "unwind" : "$tags" },
{ "group" : {
_id: { tag: "$tags" },
count: { $sum: 1 }
} }
{ "group" : {
_id: null,
total: { $sum: 1 }
} }
);
Ale to odrzuciłoby wyjście z poprzedniego potoku (pierwsza grupa). Czy istnieje sposób połączenia obu operacji przy zachowaniu danych wyjściowych każdego potoku? Wiem, że dane wyjściowe całej operacji agregującej mogą być rzutowane na tablicę w jakimś języku, a zawartość jest zliczana, ale może istnieć możliwość, że wyjście potoku przekroczy limit 16 MB. Również wykonanie tego samego zapytania tylko w celu uzyskania liczby wydaje się być marnotrawstwem.
Czy otrzymujesz wynik dokumentu i liczysz w tym samym czasie? Każda pomoc jest doceniana.
Czy naprawdę potrzebny jest całkowicie dokładne całkowitą liczbę, albo będzie przybliżenie zrobić? Z drugiej strony wygląda na to, że liczysz wszystkie posty, więc czy nie jest to tylko operacja count(), którą możesz wykonać? – cirrus
W rzeczywistości liczę na grupę postów, więc count() nie zrobi. – MervS
idealne rozwiązanie, aby uzyskać całość, zachowując wynik w potoku agregacji http://stackoverflow.com/a/39784851/3666966 –