sql >> Databasteknik >  >> NoSQL >> MongoDB

Genomsnittlig aggregation med strängtidsstämpel

Realistiskt sett "borde" du fixa tidsstämpelsträngarna här. Men de är åtminstone i "lexikal ordning" på grund av formatet "åååå-dd-mm" som är inneboende i ISO-strängar.

Så eftersom de har en fast längd kan vi faktiskt aggregera på dem med hjälp av aggregeringsramverket för en aggregering på serversidan.

Provtagning från maj månad för datumval:

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[]" }
  }}
])

Detta skulle få det totala antalet "per dag" för varje dag i den valda månaden. Detta är beroende av fältens lexikaliska värde. Samma grundprincip gäller för alla intervaller här. Så du fyller helt enkelt strängarna med nollvärden fram till det intervall du vill ha i markeringen.

Detsamma gäller för "grupperingsnyckeln" här, där värdet är _id bör på samma sätt vara delsträngen fram till det erforderliga intervallet. Lyckligtvis är strängformatet "noll vadderat" så värden är mindre än "10" föregås av en nolla som i "05" . Återigen bibehåller detta den lexikala ordningen för "intervall".

Det är det du bör sikta på, och jag antar att du bör välja dina fält här, samt skapa tidsstämpelsträngar för urvalet av intervall.

Men du kan verkligen vinna något genom att kunna $group på [$substr][2] del av det faktiska värdet för att indikera ditt önskade intervall, och du behöver inte upprepa flera frågeanrop helt enkelt för varje intervall och bara låta databasen göra det åt dig.

Dina "nycklar" är dock ett annat problem, och eftersom de inte är konsekventa verkar du ha fastnat i att iterera genom de möjliga "nyckelnamnen" och utföra en separat aggregering för dem alla. Du kan möjligen göra uttalandet längre och få "räkningar" och "summor" för var och en med $ifNull för att bestämma när den ska ökas. Då skulle du $divide "efter" $group pipeline skede för att få det slutliga "genomsnittet".

Den sista biten är lite komplicerad utan att känna till hela omfattningen, och allt är inte helt i din fråga. Så jag överlåter det till dig att räkna ut, eller ställa en separat fråga om.




  1. Hur refererar man till ett inbäddat dokument i Mongoid?

  2. Infoga ett värde vid en specifik position i en array i MongoDB

  3. MongoDB-skärning, hur balanserar den om när man lägger till nya noder?

  4. Använd redis för att skapa en realtidschatt med socket.io och NodeJs