За да постигнете желания резултат, започнете с разбиването на SQL заявката, като започнете с подзаявката:
Select *
from tblData
Where TFN in (Select TFN From @tmpTFNList) and TrendDate between @StartDate AND @EndDate
Следва еквивалентната mongo заявка:
db.getCollection("_core.data").aggregate([
{
"$match": {
"TFN": { "$in": tmpTFNList },
"TrendDate": {
"$gte": startDate,
"$lte": endDate
}
}
}
])
$group
общ еквивалент на
Select TFN, Max(Impressions) MaxImpression
from tblData
Where TFN in (Select TFN From @tmpTFNList) and TrendDate between @StartDate AND @EndDate
Group by TFN
следва
db.getCollection("_core.data").aggregate([
{
"$match": {
"TFN": { "$in": tmpTFNList },
"TrendDate": {
"$gte": startDate,
"$lte": endDate
}
}
},
{
"$group": {
"_id": "$TFN",
"MaxImpression": { "$max": "$Impression" }
}
}
])
Първите 5 заявки
Select Top 5 a.TFN, a.MaxImpression as MaxCount from (
Select TFN, Max(Impressions) MaxImpression
from tblData
Where TFN in (Select TFN From @tmpTFNList)
and TrendDate between @StartDate AND @EndDate
Group by TFN
) a
е възможно с $ ограничение
оператор и избор на полета чрез $project
етап като
db.getCollection("_core.data").aggregate([
{ /* WHERE TFN in list AND TrendDate between DATES */
"$match": {
"TFN": { "$in": tmpTFNList },
"TrendDate": {
"$gte": startDate,
"$lte": endDate
}
}
},
{ /* GROUP BY TFN */
"$group": {
"_id": "$TFN",
"MaxImpression": { "$max": "$Impression" }
}
},
{ "$limit": 5 }, /* TOP 5 */
{ /* SELECT a.MaxImpression as MaxCount */
"$project": {
"TFN": "$_id",
"_id": 0,
"MaxCount": "$MaxImpression"
}
}
])
АКТУАЛИЗАЦИЯ
За да получите желания резултат от пробата в тази редактиране
, имате нужда от допълнителен $ сортиране
конвейер преди $groupкод>
където сортирате документите по TrendDate
и Импресия
полета, и двете в низходящ ред.
След това ще трябва да използвате $first
акумулаторен оператор в рамките на $group
етап на конвейер, за да получите максимално впечатление, тъй като ще имате подреден поток от документи във вашия конвейер.
Помислете за изпълнение на ревизираната агрегатна операция като:
db.getCollection('collection').aggregate([
{
"$match": {
"TFN": { "$in": tmpTFNList },
"TrendDate": {
"$gte": startDate,
"$lte": endDate
}
}
},
{ "$sort": { "TrendDate": -1, "Impression": -1 } },
{
"$group": {
"_id": "$TFN",
"MaxImpression": { "$first": "$Impression" }
}
},
{ "$limit": 5 },
{
"$project": {
"TFN": "$_id",
"_id": 0,
"MaxCount": "$MaxImpression"
}
}
])
Примерен резултат
/* 1 */
{
"TFN" : 84251456,
"MaxCount" : 22
}
/* 2 */
{
"TFN" : 84251455,
"MaxCount" : 35
}