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

Průměrná agregace s časovým razítkem řetězce

Reálně byste zde „měli“ opravit řetězce časových razítek. Ale jsou alespoň v "lexikálním pořadí" kvůli formátu "yyyy-dd-mm", který je vlastní řetězcům ISO.

Protože mají pevnou délku, můžeme na nich skutečně agregovat pomocí agregačního rámce pro agregaci na straně serveru.

Vzorkování měsíce května pro výběr data:

cursor = client[page1.currentDB][page2.currentColl].aggregate([
  { "$match": {
     "Technique-Meteo_Direction moyenne du vent_Mean value wind direction[]":
       { "$exists": True },
     "timestamp": {
       "$gte": "2017-05-01 00:00:00", "$lt": "2017-06-01 00:00:00"
     }
  }},
  { "$group": {
    "_id": {
      "$substr": [ "$timestamp", 0, 10 ]
    },
    "average":
      { "$avg": "$Technique-Meteo_Direction moyenne du vent_Mean value wind direction[]" }
  }}
])

Získáte tak celkový počet „za den“ za každý den ve vybraném měsíci. To závisí na lexikální hodnotě polí. Pro všechny intervaly zde platí stejný základní princip. Takže jednoduše vyplníte řetězce nulovými hodnotami až do intervalu, ve kterém chcete provést výběr.

Totéž platí pro „klíč seskupení“ zde, kde je hodnota _id podobně by měl být podřetězec až do požadovaného intervalu. Naštěstí je formát řetězce "zero padded", takže hodnoty jsou menší než "10" předchází nula jako v "05" . Opět to zachovává lexikální pořadí pro "rozsahy".

To je to, na co byste se měli zaměřit, a předpokládám, že byste zde měli vybírat svá pole a také generovat řetězce časových značek pro výběr rozsahu.

Ale určitě můžete něco získat tím, že budete moci $group na [$substr][2] část skutečné hodnoty k označení požadovaného intervalu a není třeba opakovat vícenásobné vyvolání dotazu jednoduše pro každý interval a nechat databázi, aby to udělala za vás.

Vaše "klíče" jsou však dalším problémem, a protože nejsou konzistentní, zdá se, že jste uvízli v opakování možných "názvů klíčů" a provádění samostatné agregace pro všechny z nich. Možná byste mohli prohlášení prodloužit a získat "počty" a "součty" pro každý pomocí $ifNull určit, kdy zvýšit. Pak byste $divide "po" $group fáze potrubí k získání konečného „průměru“.

Ten poslední kousek je trochu komplikovaný, aniž byste znali celý rozsah, a není to všechno úplně ve vaší otázce. Takže to nechám na vás, abyste si to vyřešili, nebo se zeptejte na samostatnou otázku.




  1. Jaký je rozdíl mezi Limit a BatchSize v MongoCursor?

  2. Mongoose Unique index nefunguje!

  3. MongoDB poskytuje základní autentizační systém. Změnilo se to ve verzi 2.2.3?

  4. Mongoose uložte všechny parametry z těla požadavku