2014-09-18 11 views
7

W poniższym zapytaniu:Jak dostać się liczyć przed limitu w Mongo agregacji rurociągu

db.orders.aggregate([{ $match : { status: "A"}, { $limit: 5} }]); 

Jak mogę uzyskać zliczania zbiorów przed nałożeniem limitu? Nadal chcę, aby wywołanie zwróciło tablicę 5 dokumentów. Jeśli użyję grupy $ wydaje się, że nie zachowałoby to tablicy dokumentów. Czy można to zrobić w jednym połączeniu, czy też muszę wykonać dwa połączenia?

Odpowiedz

3

Niestety, teraz musisz wykonać dwa połączenia, jedno połączenie z operatorem limitu USD, a następnie drugie połączenie zliczania. Możesz użyć struktury agregacji bez operatora $ limit, a operator $ group obliczyć liczbę lub jako wdberkeley wskazuje, że możesz przekazać swoje kryteria do .count(), aby uzyskać liczbę zamiast używać struktury agregacji, jeśli używasz etap pojedynczego meczu.

Zobacz MongoDB - Aggregation Framework (Total Count).

+1

Użyj [.count()] (http://docs.mongodb.org/manual/reference/method/db.collection.count/), aby policzyć całkowitą liczbę wyników. – wdberkeley

+0

@ddberkeley z agregatem to nie działa. Musisz wykonać dwa połączenia, na przykład Brantino powiedział: – 1nstinct

+0

Pamiętaj, że jeśli użyjesz '.count()', zostaną zliczone wyniki, które mogły zostać wyeliminowane przez grupę $ w twoim połączeniu zagregowanym. – cib

-1

Inną opcją jest ograniczenie wyników w warstwie aplikacji, a nie w zapytaniu Mongo. Następnie możesz uzyskać pełną liczbę wyników i nie musisz wykonywać dwóch połączeń.

Na przykład w Pythonie byś zrobić:

data = db.orders.aggregate([{ "$match" : { "status": "A"} }])['result'] 
count = len(data) 
data = data[skip:skip+limit] 

Jeśli masz skomplikowaną łączną połączenie dużego zestawu danych, jest to znacznie szybciej niż co dwa połączenia.

+0

Jeśli zbiór danych jest bardzo duży, może nie pasować do pamięci - dlatego można pobrać kursor strumieniowania zamiast ładowania wszystkich zestawów wyników w pamięci serwera aplikacji. Co więcej, wykonanie operacji liczenia przez serwer db zaoszczędziłoby czasowi, aby serwer aplikacji zrobił coś innego. –

Powiązane problemy