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

Giới hạn tổng hợp trong tập hợp theo nhóm

Vì câu hỏi của bạn hiện chưa rõ ràng, tôi thực sự hy vọng ý bạn là bạn muốn chỉ định hai Site khóa và 2 Software vì đó là một câu trả lời hay và đơn giản mà bạn có thể chỉ cần thêm vào giai đoạn đối sánh $ của mình như trong:

{$match: {
    group_id: "20ea74df4f7074b33b520000",
    tracked_item_name: {$in: ['Twitter', 'Facebook', 'Word', 'Excel' ] }
}},

Và tất cả chúng ta đều có thể cổ vũ và hạnh phúc;)

Tuy nhiên, nếu câu hỏi của bạn là điều gì đó kỳ quặc hơn, chẳng hạn như, lấy 2 Sites hàng đầu và Software các mục nhập từ kết quả theo thời lượng, sau đó chúng tôi cảm ơn bạn rất nhiều vì đã tạo ra sự ghê tởm này .

Cảnh báo:

Số dặm của bạn có thể thay đổi tùy thuộc vào những gì bạn thực sự muốn làm hoặc liệu điều này có bị ảnh hưởng bởi kích thước tuyệt đối của kết quả của bạn hay không. Nhưng điều này sau đây là một ví dụ về những gì bạn đang tham gia để:

db.collection.aggregate([

    // Match items first to reduce the set
    {$match: {group_id: "20ea74df4f7074b33b520000" }},

    // Group on the types and "sum" of duration
    {$group: {
        _id: {
            tracked_item_type: "$tracked_item_type",
            tracked_item_name: "$tracked_item_name"
         },
         duration: {$sum: "$duration"}
    }},

    // Sort by type and duration descending
    {$sort: { "_id.tracked_item_type": 1, duration: -1 }},

    /* The fun part */

    // Re-shape results to "sites" and "software" arrays 
    {$group: { 
        _id: null,
        sites: {$push:
            {$cond: [
                {$eq: ["$_id.tracked_item_type", "Site" ]},
                { _id: "$_id", duration: "$duration" },
                null
            ]}
        },
        software: {$push:
            {$cond: [
                {$eq: ["$_id.tracked_item_type", "Software" ]},
                { _id: "$_id", duration: "$duration" },
                null
            ]}
        }
    }},


    // Remove the null values for "software"
    {$unwind: "$software"},
    {$match: { software: {$ne: null} }},
    {$group: { 
        _id: "$_id",
        software: {$push: "$software"}, 
        sites: {$first: "$sites"} 
    }},

    // Remove the null values for "sites"
    {$unwind: "$sites"},
    {$match: { sites: {$ne: null} }},
    {$group: { 
        _id: "$_id",
        software: {$first: "$software"},
        sites: {$push: "$sites"} 
    }},


    // Project out software and limit to the *top* 2 results
    {$unwind: "$software"},
    {$project: { 
        _id: 0,
        _id: { _id: "$software._id", duration: "$software.duration" },
        sites: "$sites"
    }},
    {$limit : 2},


    // Project sites, grouping multiple software per key, requires a sort
    // then limit the *top* 2 results
    {$unwind: "$sites"},
    {$group: {
        _id: { _id: "$sites._id", duration: "$sites.duration" },
        software: {$push: "$_id" }
    }},
    {$sort: { "_id.duration": -1 }},
    {$limit: 2}

])  

Bây giờ kết quả là * không chính xác tập hợp kết quả rõ ràng sẽ là lý tưởng nhưng nó là thứ có thể được lập trình làm việc với và tốt hơn so với việc lọc các kết quả trước đó trong một vòng lặp. (Dữ liệu của tôi từ thử nghiệm)

{
    "result" : [
        {
            "_id" : {
                "_id" : {
                    "tracked_item_type" : "Site",
                    "tracked_item_name" : "Digital Blasphemy"
                 },
                 "duration" : 8000
            },
            "software" : [
                {
                    "_id" : {
                        "tracked_item_type" : "Software",
                        "tracked_item_name" : "Word"
                    },
                    "duration" : 9540
                },

                {
                    "_id" : {
                        "tracked_item_type" : "Software",
                        "tracked_item_name" : "Notepad"
                    },
                    "duration" : 4000
                }
            ]
        },
        {
            "_id" : {
                "_id" : {
                    "tracked_item_type" : "Site",
                    "tracked_item_name" : "Facebook"
                 },
                 "duration" : 7920
            },
            "software" : [
                {
                    "_id" : {
                        "tracked_item_type" : "Software",
                         "tracked_item_name" : "Word"
                    },
                    "duration" : 9540
                },
                {
                    "_id" : {
                        "tracked_item_type" : "Software",
                        "tracked_item_name" : "Notepad"
                    },
                    "duration" : 4000
                }
            ]
        }
    ],
    "ok" : 1
}

Vì vậy, bạn thấy bạn nhận được 2 Sites hàng đầu trong mảng, với 2 Software hàng đầu các mục được nhúng trong mỗi. Bản thân việc tổng hợp, không thể làm rõ điều này thêm nữa, bởi vì chúng tôi cần phải hợp nhất lại các mục chúng tôi tách ra để thực hiện việc này và chưa có toán tử nào mà chúng tôi có thể sử dụng để thực hiện hành động này.

Nhưng đó là niềm vui. Đó không phải là tất cả cách được thực hiện, nhưng hầu hết theo cách này, và biến nó thành một phản hồi 4 tài liệu sẽ là một đoạn mã tương đối nhỏ. Nhưng đầu tôi đã đau rồi.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tại sao express nói với tôi rằng công cụ xem mặc định của tôi không được xác định?

  2. Làm cách nào để đổi tên (các) trường bí danh trong khi tìm nạp nó từ MongoDB thông qua truy vấn sử dụng ổ đĩa gốc MongoDB-Node.JS?

  3. Mongodb 4:Không khởi động được mongod.service:Không tìm thấy đơn vị mongod.service

  4. Sử dụng tổng hợp nhân với MongoDB

  5. GroupBy Aggregation bao gồm các ngày bị thiếu trong mongo