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

Групов резултат по 15 минути времеви интервал в MongoDb

Има няколко начина да направите това.

Първият е с оператори за агрегиране на дати, които ви позволяват да анализирате стойностите на "дата" в документите. Специално за „групиране“ като основно намерение:

db.collection.aggregate([
  { "$group": {
    "_id": {
      "year": { "$year": "$created_at" },
      "dayOfYear": { "$dayOfYear": "$created_at" },
      "hour": { "$hour": "$created_at" },
      "interval": {
        "$subtract": [ 
          { "$minute": "$created_at" },
          { "$mod": [{ "$minute": "$created_at"}, 15] }
        ]
      }
    }},
    "count": { "$sum": 1 }
  }}
])

Вторият начин е чрез използване на малък трик за това, когато обект за дата се изважда (или друга директна математическа операция) от друг обект с дата, тогава резултатът е числова стойност, представляваща емблемата за епоха в милисекунди между двата обекта. Така че само като използвате датата на епохата, получавате представянето на милисекунди за епохата. След това използвайте математика по дата за интервала:

db.collection.aggregate([
    { "$group": {
        "_id": {
            "$subtract": [
                { "$subtract": [ "$created_at", new Date("1970-01-01") ] },
                { "$mod": [ 
                    { "$subtract": [ "$created_at", new Date("1970-01-01") ] },
                    1000 * 60 * 15
                ]}
            ]
        },
        "count": { "$sum": 1 }
    }}
])

Така че зависи какъв вид изходен формат искате за интервала на групиране. И двете по същество представляват едно и също нещо и имат достатъчно данни, за да се реконструират като обект „дата“ във вашия код.

Можете да поставите всичко друго, което искате, в частта "оператор за групиране" след групирането _id . Просто използвам основния пример за „брой“ вместо всяко реално изявление от вас относно това, което наистина искате да направите.

MongoDB 4.x и по-нови версии

Имаше някои допълнения към операторите за агрегиране на дати от първоначалното писане, но от MongoDB 4.0 ще има действително „реално прехвърляне на типове“, за разлика от основните математически трикове, направени тук с BSON преобразуване на дата.

Например можем да използваме $toLong и $toDate като нови помощници тук:

db.collection.aggregate([
  { "$group": {
    "_id": {
      "$toDate": {
        "$subtract": [
          { "$toLong": "$created_at" },
          { "$mod": [ { "$toLong": "$created_at" }, 1000 * 60 * 15 ] }
        ]
      }
    },
    "count": { "$sum": 1 }
  }}
])

Това е малко по-кратко и не изисква дефиниране на външна BSON дата за стойността "епоха" като константа при дефинирането на конвейера, така че е доста последователна за всички езикови реализации.

Това са само два от "помощните" методи за преобразуване на типове, които всички се свързват с $convert метод, който е "по-дълга" форма на реализацията, позволяваща персонализирана обработка на null или грешка в преобразуването.

Възможно е дори с такова кастинг да получите Date информация от ObjectId на първичния ключ, тъй като това би било надежден източник на дата на "създаване":

db.collection.aggregate([
  { "$group": {
    "_id": {
      "$toDate": {
        "$subtract": [
          { "$toLong": { "$toDate": "$_id" }  },
          { "$mod": [ { "$toLong": { "$toDate": "$_id" } }, 1000 * 60 * 15 ] }
        ]
      }
    },
    "count": { "$sum": 1 }
  }}
])

Така че „типове на кастинг“ с този вид преобразуване могат да бъдат доста мощен инструмент.

Предупреждение - ObjectId стойностите са ограничени до точност до втора само за вътрешната времева стойност, която съставлява част от техните данни, позволяваща $toDate преобразуване. Действителното въведено "време" най-вероятно зависи от използвания драйвер. Където прецизност се изисква, все пак се препоръчва използването на дискретно поле за дата на BSON вместо да разчитате на ObjectId стойности.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $sum Оператор на конвейер за агрегиране

  2. Как да инсталирате MongoDB на Windows система?

  3. Съвети за надграждане до най-новата версия на MongoDB

  4. Как да актуализирам документ на Mongo след поставянето му?

  5. Защо имаме нужда от „арбитър“ в репликацията на MongoDB?