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

събиране на данни за групиране по множество полета mongodb

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

{
    "28-10-2016":{
        "success_count": 10, 
        "failure_count": 10
    },
    "29-10-2016": {
        "success_count": 10, 
        "failure_count": 10
    }
}

бихте имали по-добра структура като

[
    {
        "_id": "28-10-2016",
        "success_count": 10, 
        "failure_count": 10
    },
        "_id": "29-10-2016",
        "success_count": 10, 
        "failure_count": 10
    }
]

Постигането на горния резултат ще изисква използването на $cond оператор в $sum акумулатор оператор. $cond ще оцени логическо условие въз основа на първия му аргумент (if) и след това ще върне втория аргумент, където оценката е вярна (then) или третия аргумент, когато е false (else). Това преобразува логиката true/false в 1 и 0 числови стойности, които се подават в $sum съответно:

"success_count": {
    "$sum": {
        "$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
    }
}

Като резултат от конвейера трябва да се изпълни операцията за агрегиране, която използва $dateToString оператор в _id ключов израз за $group тръбопровод:

Orders.aggregate([
    {
        "$group": {
            "_id": {
                "$dateToString": { 
                    "format": "%Y-%m-%d", 
                    "date": "$created_at" 
                }
            },
            "success_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
                }
            },
            "failure_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$status", "failure" ] }, 1, 0 ]
                }
            }
        }
    }
], function (err, orders){
    if (err) throw err;
    console.log(orders);
})

Съществува обаче по-гъвкав и по-ефективен подход, който се изпълнява много по-бързо от горния, където най-ефективната структура на данните за вашия резултат от агрегирането следва схемата, например:

orders = [
    {
        "_id": "28-10-2016",
        "counts": [
            { "status": "success", "count": 10 },
            { "status": "failure", "count": 10 }
        ]
    },
    {
        "_id": "29-10-2016",
        "counts": [
            { "status": "success", "count": 10 },
            { "status": "failure", "count": 10 }
        ]
    }
]

След това помислете за стартиране на алтернативен тръбопровод, както следва

Orders.aggregate([
    { 
        "$group": {
            "_id": { 
                "date":  {
                    "$dateToString": { 
                        "format": "%Y-%m-%d", 
                        "date": "$created_at" 
                    }
                },
                "status": { "$toLower": "$status" }
            },
            "count": { "$sum": 1 }
        }
    },
    { 
        "$group": {
            "_id": "$_id.date",
            "counts": {
                "$push": {
                    "status": "$_id.status",
                    "count": "$count"
                }
            }
        }
    }
], function (err, orders){
    if (err) throw err;
    console.log(orders);
})



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Rails - Къде MongoDB (Mongoid) съхранява db и регистрационни файлове?

  2. MongoDB c# драйвер - Може ли поле, наречено Id, да не бъде Id?

  3. MongoDB Извличане на документи бавно (използвано индексиране)

  4. MongoDB изберете къде в масива от _id?

  5. mongodb geoNear срещу близо