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

Агрегирайте $group за множество периоди от време

Трябва условно да определите ключа за групиране въз основа на това къде текущата дата попада между диапазона. Това основно се постига чрез $cond с вложени условия и логическия вариант на $lt :

// work out dates somehow
var today = new Date(),
    oneDay = ( 1000 * 60 * 60 * 24 ),
    thirtyDays = new Date( today.valueOf() - ( 30 * oneDay ) ),
    fifteenDays = new Date( today.valueOf() - ( 15 * oneDay ) ),
    sevenDays = new Date( today.valueOf() - ( 7 * oneDay ) );

db.collection.aggregate([
    { "$match": {
        "date": { "$gte": thirtyDays }
    }},
    { "$group": {
        "_id": {
            "$cond": [
                { "$lt": [ "$date", fifteenDays ] },
                "16-30",
                { "$cond": [
                    { "$lt": [ "$date", sevenDays ] },
                    "08-15",
                    "01-07"
                ]}
            ]
        },
        "count": { "$sum": 1 },
        "totalValue": { "$sum": "$value" }
    }}
])

Като $cond е троичен оператор, първото условие се оценява, за да се види дали условието е вярно, и когато е вярно, се връща вторият аргумент, в противен случай третият се връща, когато е невярно. Така че чрез влагане на друг $cond в фалшивия случай получавате логическия тест за това къде попада датата, или „по-малко от 15-дневната дата“, което означава, че е в най-стария диапазон, или „по-малко от 7 дни“, което означава средния диапазон, или, разбира се, е в най-новата гама.

Просто поставям пред числата тук по-малко от 10 0 така че ви дава нещо за сортиране, ако искате, тъй като изходът на "ключове" в $group сам по себе си не е подреден.

Но това е начинът, по който правите това в една заявка. Вие просто определяте какъв трябва да бъде ключът за групиране въз основа на това къде пада датата и натрупвате за всеки ключ.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да извърша намиране с помощта на $geoIntersects / 2dsphere в подполе на масив?

  2. Преобразувайте разликата в датата в години, за да изчислите възрастта в MongoDB

  3. Актуализиране с AddToSet без актуализиране на нулева стойност с MongoDB C#

  4. Как да разреша това дизайнерско ограничение в mongo db спрямо производителността?

  5. MongoDB $orderBy