MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tối đa và nhóm theo Mongodb

Để đạ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 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
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm thế nào để lấy bất kỳ mục nào (Point, LineString, Polygon) trong một hộp giới hạn trong mongodb

  2. Mongo tìm và cập nhật hàng loạt trường tài liệu phù hợp trong một truy vấn?

  3. MongoDB - Chiếu một trường không phải lúc nào cũng tồn tại

  4. Golang / MGO - hoảng sợ:không có máy chủ nào có thể truy cập

  5. Lỗi kết nối MongoLab / PyMongo