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

Průměr pole dílčího dokumentu napříč dokumenty v Mongo

Budete muset použít agregační rámec. Agregace bude nakonec vypadat nějak takto:

db.stack.aggregate([
  { $match: { "samples.key" : "test-key" } },
  { $unwind : "$samples" },
  { $match : { "samples.key" : "test-key" } },
  { $project : { "new_key" : "$samples.key", "new_value" : "$samples.value" } },
  { $group : { `_id` : "$new_key", answer : { $avg : "$new_value" } } }
])

Nejlepší způsob, jak si představit agregační rámec, je jako montážní linka. Samotný dotaz je polem dokumentů JSON, kde každý dílčí dokument představuje jiný krok v sestavení.

Krok 1:$match

Prvním krokem je základní filtr, jako je klauzule WHERE v SQL. Tento krok umístíme jako první, abychom odfiltrovali všechny dokumenty, které neobsahují prvek pole obsahující test-key . Umístění na začátek kanálu umožňuje agregaci používat indexy.

Krok 2:$unwind

Druhý krok, $unwind , se používá k oddělení každého z prvků v poli "samples", abychom mohli provádět operace napříč všemi z nich. Pokud spustíte dotaz právě tímto krokem, uvidíte, co tím myslím. Krátký příběh:

{ name : "bob", 
  children : [ {"name" : mary}, { "name" : "sue" } ] 
} 

se stává dvěma dokumenty:

{ name : "bob", children : [ { "name" : mary } ] }
{ name : "bob", children : [ { "name" : sue } ] }

Krok 3:$match

Třetí krok, $match , je přesným duplikátem prvního $match etapa, ale má jiný účel. Protože následuje po $unwind , tato fáze odfiltruje předchozí prvky pole, nyní dokumenty, které neodpovídají kritériím filtru. V tomto případě uchováváme pouze dokumenty, kde samples.key = "test-key"

Krok 4:$project (volitelné)

Čtvrtý krok, $project , restrukturalizuje dokument. V tomto případě jsem položky vytáhl z pole, abych na ně mohl přímo odkazovat. Pomocí výše uvedeného příkladu...

{ name : "bob", children : [ { "name" : mary } ] }

se stává

{ new_name : "bob", new_child_name : mary }

Všimněte si, že tento krok je zcela volitelný; pozdější fáze by mohly být dokončeny i bez tohoto $project po několika menších změnách. Ve většině případů $project je čistě kosmetický; agregace mají pod kapotou řadu optimalizací, například ruční zahrnutí nebo vyloučení polí v $project by nemělo být nutné.

Krok 5:$group

Nakonec $group kde se děje kouzlo. _id važte si toho, podle čeho budete ve světě SQL „seskupovat“. Druhé pole říká, že průměr je nad hodnotou, kterou jsem definoval v $project krok. Můžete snadno nahradit $sum provést součet, ale operace počítání se obvykle provádí následujícím způsobem:my_count : { $sum : 1 } .

Nejdůležitější věcí, kterou je třeba poznamenat, je, že většina práce, kterou provádíte, je formátování dat do bodu, kdy je provedení operace jednoduché.

Poznámka na závěr

Nakonec bych chtěl poznamenat, že to není pracovat na vzorových datech poskytnutých od samples.value je definován jako text, který nelze použít v aritmetických operacích. Pokud máte zájem, změna typu pole je popsána zde:MongoDB Jak změnit typ pole




  1. Agregát Mongodb:převeďte datum na jiné časové pásmo

  2. Ověření jedinečnosti vloženého dokumentu vymezeného jeho nadřazeným prvkem v mongoose

  3. Jak nainstalovat Redis

  4. Použití Cloudera Data Engineering k analýze dat programu ochrany výplaty