sql >> Databáze >  >> NoSQL >> MongoDB

Mongo agregační kurzor a počítání

To si možná zaslouží úplné vysvětlení pro ty, kteří by to mohli hledat, takže přidejte jedno pro potomky.

Konkrétně to, co je vráceno, je stream událostí pro node.js, který efektivně obaluje stream.Readable rozhraní s několika pohodlnými metodami. A .count() v současnosti mezi ně nepatří a vzhledem k aktuálnímu použitému rozhraní by to nedávalo moc smysl.

Podobné jako výsledek vrácený z .stream() metoda dostupná kurzorovým objektům, "počet" by zde nedával velký smysl, když zvažujete implementaci, protože je myšleno zpracovat jako "stream", kde nakonec dosáhnete "konce", ale jinak chcete pouze zpracovat dokud se tam nedostanete.

Pokud jste uvažovali o standardním rozhraní „Kurzor“ z ovladače, existuje několik vážných důvodů, proč agregační kurzor není stejný:

  1. Kurzory umožňují zpracování akcí "modifikátorů" před provedením. Ty spadají do kategorií .sort() , .limit() a .skip() . Všechny tyto ve skutečnosti mají v agregačním rámci protějšky direktiv, které jsou specifikovány v kanálu. Vzhledem k tomu, že se jedná o fáze zřetězení, které by se mohly objevit „kdekoli“, a nejen jako možnost následného zpracování jednoduchého dotazu, nedávalo by velký smysl nabízet stejné „kurzorové“ zpracování.

  2. Mezi další modifikátory kurzoru patří speciality jako .hint() , .min() a .max() což jsou změny "výběru indexu" a zpracování. I když je lze použít pro agregační kanál, v současné době neexistuje jednoduchý způsob, jak je zahrnout do výběru dotazů. Většinou logika z předchozího bodu přepíše jakýkoli bod použití stejného typu rozhraní pro "kurzor".

Dalšími úvahami jsou to, co vlastně chcete s kurzorem dělat a proč „chcete“ kurzor vrátit. Vzhledem k tomu, že kurzor je obvykle „jednosměrná jízda“ v tom smyslu, že se obvykle zpracovává pouze do konce a v použitelných „dávkách“, pak z toho vyplývá rozumný závěr, že „počet“ skutečně přichází na konci, když je ve skutečnosti tato „fronta“ konečně vyčerpána.

I když je pravda, že ve skutečnosti standardní implementace „kurzoru“ obsahuje určité triky, hlavním důvodem je to, že pouze rozšiřuje koncept „meta“ dat, protože modul pro profilování dotazů musí „naskenovat“ určitý počet dokumentů, aby určil, který položky, které se mají ve výsledku vrátit.

Agregační rámec si s tímto konceptem trochu pohrává. Protože nejenže existují stejné výsledky, jaké by byly zpracovány prostřednictvím standardního profilovače dotazů, ale také existují další fáze. Kterákoli z těchto fází má potenciál „upravit“ výsledný „počet“, který by se ve skutečnosti vrátil do „streamu“ ke zpracování.

Znovu, pokud se na to chcete podívat z akademického hlediska a říct, že "Jistě, dotazovací modul by měl uchovávat 'metadata' pro počet, ale nemůžeme sledovat, co se poté změní?". To by byl férový argument a provozovatelé potrubí, jako je $match a $group nebo $unwind a možná i včetně $project a nový $redact , všechny by mohly být považovány za rozumný důvod k tomu, aby si vedli vlastní přehled o „zpracovaných dokumentech“ v každé fázi kanálu a aktualizovali je v „meta datech“, která by mohla být případně vrácena, aby vysvětlila celkový počet výsledků kanálu.

Poslední argument je rozumný, ale zvažte také, že v současné době je implementace konceptu „kurzoru“ pro výsledky agregačního kanálu novým konceptem pro MongoDB. Dalo by se spravedlivě tvrdit, že všechna „rozumná“ očekávání v prvním bodě návrhu by byla taková, že „většina“ výsledků z kombinování dokumentů nebude mít velikost, která by omezovala omezení BSON. Ale jak se používání rozšiřuje, vnímání se mění a věci se mění, aby se přizpůsobily.

Takže toto "mohlo" být možná změněno, ale není to tak, jak je to "aktuálně" implementováno. Zatímco .count() na standardní implementaci kurzoru má přístup k "metadatům", kde je zaznamenáno naskenované číslo, jakákoli metoda v aktuální implementaci by vedla k načtení všech výsledků kurzoru, stejně jako .itcount() dělá ve skořápce.

Zpracujte položky „kurzoru“ tak, že počítejte s událostí „data“ a na konci vyšlete něco (případně generátor proudu JSON) jako „počet“. Pro jakýkoli případ použití, který by vyžadoval počet "vpředu", by se to stejně nezdálo jako platné použití kurzoru, protože výstupem by jistě byl celý dokument přiměřené velikosti.




  1. aktualizovat konkrétní prvek z pole vnořených dokumentů mongodb, kde má dvě shody

  2. Jak mohu vrátit pole objektů mongodb v pymongo (bez kurzoru)? Dokáže to MapReduce?

  3. NodeJS + MongoDB:insertOne() - získat vložený dokument z result.ops

  4. Jak najdete podle ID pomocí ovladače MongoDB Node?