MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Средно агрегиране с клеймо за време на низ

Реално погледнато "трябва" да поправите низовете на времевия печат тук. Но те са поне в "лексикален ред" поради формата "гггг-дд-мм", присъщ на ISO низовете.

Тъй като те имат фиксирана дължина, ние всъщност можем да ги агрегираме, като използваме рамката за агрегиране за агрегиране от страна на сървъра.

Извадка от месец май за избор на дата:

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

Това ще получи общата сума „на ден“ за всеки ден от избрания месец. Това зависи от лексикалната стойност на полетата. Същият основен принцип важи за всички интервали тук. Така че просто попълвате низовете с нулевите стойности до интервала, който искате да изберете.

Същото важи и за „ключа за групиране“ тук, където стойността на _id по подобен начин трябва да бъде поднизът до необходимия интервал. За щастие форматът на низа е "подплатен с нула", така че стойностите са по-малки от "10" се предхождат от нула, както в "05" . Отново това поддържа лексикалния ред за "диапазони".

Това е, към което трябва да се стремите и предполагам, че трябва да избирате вашите полета тук, както и да генерирате низовете с времеви клеймото за избор на диапазон.

Но със сигурност можете да спечелите нещо, като можете да $group на [$substr][2] част от действителната стойност, за да посочите необходимия ви интервал и не е необходимо да повтаряте множество извиквания на заявки просто за всеки интервал и просто оставете базата данни да го направи вместо вас.

Вашите „ключове“ обаче са друг проблем и тъй като те не са последователни, изглежда сте заседнали с итерация през възможните „имена на ключове“ и извършване на отделно агрегиране за всички тях. Евентуално бихте могли да направите изявлението по-дълго и да получите „броенето“ и „сумите“ за всеки, като използвате $ifNull за да определите кога да увеличите. Тогава бихте $divide "след" $group етап на конвейер, за да получите крайната "средна стойност".

Този последен бит е малко сложен, без да се знае пълният обхват, и не всичко е напълно във вашия въпрос. Така че ще оставя това на вас да решите или ще задам отделен въпрос.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да разположите MongoDB за висока наличност

  2. Преданият аргумент трябва да бъде единичен низ от 12 байта

  3. Добавете стойности на масив в MongoDB, където елементът не е в масива

  4. опитвайки се да покажа данни в jade от mongodb

  5. Актуализация на хеширана парола с mongoose express