Để đạt được kết quả mong muốn, hãy bắt đầu bằng cách chia nhỏ truy vấn SQL bắt đầu bằng truy vấn phụ:
Select *
from tblData
Where TFN in (Select TFN From @tmpTFNList) and TrendDate between @StartDate AND @EndDate
Truy vấn mongo tương đương như sau:
db.getCollection("_core.data").aggregate([
{
"$match": {
"TFN": { "$in": tmpTFNList },
"TrendDate": {
"$gte": startDate,
"$lte": endDate
}
}
}
])
$ group
tương đương tổng hợp của
Select TFN, Max(Impressions) MaxImpression
from tblData
Where TFN in (Select TFN From @tmpTFNList) and TrendDate between @StartDate AND @EndDate
Group by TFN
theo sau
db.getCollection("_core.data").aggregate([
{
"$match": {
"TFN": { "$in": tmpTFNList },
"TrendDate": {
"$gte": startDate,
"$lte": endDate
}
}
},
{
"$group": {
"_id": "$TFN",
"MaxImpression": { "$max": "$Impression" }
}
}
])
5 truy vấn hàng đầu
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
có thể thực hiện được với $ giới hạn
toán tử và lựa chọn trường thông qua $ dự án
giai đoạn như
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"
}
}
])
CẬP NHẬT
Để có được kết quả mong muốn từ mẫu, hãy chỉnh sửa
này , bạn cần thêm $ sắp xếp
đường dẫn trước $ group
nơi bạn sắp xếp tài liệu theo TrendDate
và Lần hiển thị
các trường, cả hai đều theo thứ tự giảm dần.
Sau đó, bạn sẽ phải sử dụng mã <> $ đầu tiên
toán tử bộ tích lũy trong nhóm $
giai đoạn đường ống để có được ấn tượng tối đa vì bạn sẽ có một luồng tài liệu có thứ tự trong đường dẫn của mình.
Xem xét chạy hoạt động tổng hợp đã sửa đổi như:
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"
}
}
])
Đầu ra mẫu
/* 1 */
{
"TFN" : 84251456,
"MaxCount" : 22
}
/* 2 */
{
"TFN" : 84251455,
"MaxCount" : 35
}