MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Kursor agregacji Mongo i liczenie

To prawdopodobnie zasługuje na pełne wyjaśnienie dla tych, którzy mogą tego szukać, więc dodaj jedno dla potomności.

W szczególności zwracany jest strumień zdarzeń dla node.js, który skutecznie otacza stream.Readable interfejs z kilkoma wygodnymi metodami. .count() obecnie nie jest jednym z nich i biorąc pod uwagę aktualnie używany interfejs, nie miałoby to większego sensu.

Podobny do wyniku zwróconego przez .stream() metoda dostępna dla obiektów kursora, „liczba” nie miałaby tutaj większego sensu, gdy weźmiesz pod uwagę implementację, ponieważ ma ona przetwarzać jako „strumień”, w którym w końcu dojdziesz do „końca”, ale poza tym po prostu chcesz przetworzyć aż tam dotrzesz.

Jeśli rozważyłeś standardowy interfejs „Kursora” ze sterownika, istnieją pewne solidne powody, dla których kursor agregacji nie jest taki sam:

  1. Kursory umożliwiają przetworzenie akcji „modyfikatora” przed wykonaniem. Należą one do kategorii .sort() , .limit() i .skip() . Wszystkie te w rzeczywistości mają odpowiedniki dyrektyw w ramach agregacji, które są określone w potoku. Jako etapy potoku, które mogą pojawić się „w dowolnym miejscu”, a nie tylko jako opcja przetwarzania końcowego prostego zapytania, oferowanie tego samego przetwarzania „kursorowego” nie miałoby większego sensu.

  2. Inne modyfikatory kursora obejmują specjalne, takie jak .hint() , .min() i .max() które są zmianami „wyboru indeksu” i przetwarzania. Chociaż mogą one być przydatne w potoku agregacji, obecnie nie ma prostego sposobu na uwzględnienie ich w wyborze zapytania. Przeważnie logika z poprzedniego punktu zastępuje dowolny punkt używania tego samego typu interfejsu dla "Kursora".

Inne rozważania dotyczą tego, co faktycznie chcesz zrobić z kursorem i dlaczego „chcesz”, aby go zwrócono. Ponieważ kursor jest zwykle „podróżą w jedną stronę” w tym sensie, że są one zwykle przetwarzane tylko do końca i w użytecznych „partiach”, to daje rozsądny wniosek, że „liczenie” po prostu faktycznie nadchodzi na końcu, kiedy w rzeczywistości ta „kolejka” w końcu się wyczerpie.

Chociaż prawdą jest, że w rzeczywistości standardowa implementacja „kursora” zawiera pewne sztuczki, głównym powodem jest to, że po prostu rozszerza pojęcie „meta” danych, ponieważ silnik profilowania zapytań musi „zeskanować” określoną liczbę dokumentów w celu określenia, które elementy do zwrócenia w wyniku.

Ramy agregacji trochę bawią się tą koncepcją. Ponieważ istnieją nie tylko te same wyniki, które zostałyby przetworzone przez standardowy profiler zapytań, ale także istnieją dodatkowe etapy. Każdy z tych etapów może „zmodyfikować” wynikową „liczbę”, która faktycznie zostanie zwrócona w „strumieniu” do przetworzenia.

Ponownie, jeśli chcesz spojrzeć na to z akademickiego punktu widzenia i powiedzieć, że "Oczywiście, silnik zapytań powinien zachować 'metadane' dla zliczenia, ale czy nie możemy śledzić, co zostało później zmodyfikowane?". Byłby to uczciwy argument, a operatory potoku, takie jak $match i $group lub $unwind i być może nawet w tym $project oraz nowy $redact , wszystkie można uznać za rozsądny przypadek prowadzenia własnego śledzenia „dokumentów przetworzonych” na każdym etapie potoku i aktualizowania ich w „metadanych”, które mogłyby zostać zwrócone, aby wyjaśnić pełną liczbę wyników potoku.

Ostatni argument jest rozsądny, ale należy wziąć pod uwagę, że w chwili obecnej implementacja koncepcji „Kursora” dla wyników potoku agregacji jest nową koncepcją dla MongoDB. Można śmiało argumentować, że wszystkie „rozsądne” oczekiwania w pierwszym punkcie projektowania byłyby takie, że „większość” wyników z łączenia dokumentów nie będzie miała rozmiaru ograniczającego ograniczenia BSON. Ale wraz z rozszerzaniem się użytkowania zmienia się postrzeganie i rzeczy zmieniają się, aby się dostosować.

Więc to „można” ewentualnie zmienić, ale nie jest to „obecnie” implementowane. Podczas gdy .count() w przypadku standardowej implementacji kursora ma dostęp do "metadanych", w których rejestrowany jest zeskanowany numer, każda metoda w bieżącej implementacji spowoduje pobranie wszystkich wyników kursora, tak jak .itcount() robi w powłoce.

Przetwarzaj elementy „kursora”, licząc na zdarzenie „data” i emitując coś (prawdopodobnie generator strumienia JSON) jako „count” na końcu. W każdym przypadku użycia, który wymagałby zliczenia „z góry”, i tak nie wydawałoby się to prawidłowym użyciem kursora, ponieważ z pewnością wynik byłby całym dokumentem o rozsądnym rozmiarze.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak utworzyć plik konfiguracyjny dla MongoDB

  2. Wyrażenie regularne MongoDB:zawiera wiadomość e-mail wewnątrz ciągu

  3. Używasz JSON z MongoDB?

  4. Wymuszanie kontroli dostępu opartej na rolach za pomocą ClusterControl

  5. Poddokument MongoDB NodeJS Return