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.
[
{ $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