terça-feira, 25 de fevereiro de 2014

Olá!

Já vimos aqui no blog como funciona o aggregation framework no MongoDB (MongoDB - Aggregation Framework - Exemplos).

No post de hoje falaremos mais sobre o operador $cond. Ele é um operador ternário, composto de um array com três expressões: a primeira é uma expressão booleana que é avaliada; caso ela seja verdadeira, o $cond avaliará a segunda expressão retornando seu valor e, caso seja falsa, avalia a terceira expressão para retornar seu valor.

O $cond possui a seguinte sintaxe:

{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }

sendo que qualquer uma das três expressões podem ser algum dos operadores de agregação (MongoDB - Aggregation Framework - Exemplos) ou outros campos de seu documento.

Temos agora dois exemplos de uso:

1 - Uso do operador $cond em uma collection chamada survey, agregando pelo campo item_id para verificar se, caso o level seja "E", adicione 2 ao contador "weightedCount" ou 1, caso contrário.
 
 db.survey.aggregate(
   [
      { $group: {
            _id: "$item_id",
            weightedCount: { $sum: { $cond: [ { $eq: [ "$level", "E" ] } , 2, 1 ] } }
         }
      }
   ]
)


2 - Dado o conjunto de documentos abaixo, deseja-se contar a quantidade do campo "LoadTime" para cada um dos seguintes grupos: slowest (maior que 2), slow (entre 1 e 2), médium (entre 0,5 e 1) e fast (abaixo de 0,5)

Documentos:
{
    "_id" : 1,
    "LoadTime" : NumberLong(345),
    "StatCode" : 200
}
{
    "_id" : 2,
    "LoadTime" : NumberLong(234),
    "StatCode" : 200
}
....
{
    "_id" : 9,
    "LoadTime" : NumberLong(712),
    "StatCode" : 301
}
{
    "_id" : 10,
    "LoadTime" : NumberLong( 1784),
    "StatCode" : 200
}



Realizando o agrupamento via opereador $cond:

db.collection.aggregate([
    {"$group": {
      "_id": {"$cond": [
          {"$gte": ["$LoadTime", 2000] },
          "Slowest",                                   // return "Slowest" where true
          {"$cond": [
              {"$and": [
                  {"$lt": ["$LoadTime", 2000] },
                  {"$gte": ["$LoadTime", 1000] }
              ]},
              "Slow",                                  // then "Slow" here where true
              {"$cond": [
                  {"$and": [
                      {"$lt": ["$LoadTime", 1000] },
                      {"$gte": ["$LoadTime", 500 ] }
                  ]},
                  "Medium",                            // then "Medium" where true
                  "Fast"                               // and finally "Fast" < 500
              ]}
          ]}
      ]},
      "count": {"$sum": 1}
    }},
    {"$sort": { "count": 1 }}
])




Os exemplos foram extraídos da documentação do MongoDB e do site stackoverflow (Mongodb aggregate, How to count documents by interval criteria?).


Abraço e até o próximo post!

0 comentários:

Postar um comentário