MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB दस्तावेज़ को फिर से आकार देना

यहां एक एकत्रीकरण है जो प्रत्येक श्रेणी में अवधि के अनुसार शीर्ष दो को ढूंढता है (यह मनमाने ढंग से "संबंधों" को तोड़ता है, जो आपके नमूना आउटपुट के अनुरूप लगता है):

var pregroup = { "$group" : {
        "_id" : {
            "type" : "$tracked_item_type",
            "name" : "$tracked_item_name"
        },
        "duration" : {
            "$sum" : "$duration"
        }
    }
};
var sort = { "$sort" : { "_id.type" : 1, "duration" : -1 } };
var group1 = { "$group" : {
        "_id" : "$_id.type",
        "num1" : {
            "$first" : {
                "name" : "$_id.name",
                "dur" : "$duration"
            }
        },
        "other" : {
            "$push" : {
                "name" : "$_id.name",
                "dur" : "$duration"
            }
        },
    "all" : {
        "$push" : {
            "name" : "$_id.name",
            "dur" : "$duration"
        }
    }
    }
};
var unwind = { "$unwind" : "$other" };
project = {
    "$project" : {
        "keep" : {
            "$ne" : [
                "$num1.name",
                "$other.name"
            ]
        },
        "num1" : 1,
        "all" : 1,
        "other" : 1
    }
};
var match = { "$match" : { "keep" : true } };
var sort2 = { "$sort" : { "_id" : 1, "other.dur" : -1 } };
var group2 = { "$group" : {
        "_id" : "$_id",
        "numberOne" : {
            "$first" : "$num1"
        },
        "numberTwo" : {
            "$first" : "$other"
        },
    "all" : {
        "$first" : "$all"
    }
    }
};
unwind2 = { "$unwind" : "$all" };
project2 = { "$project" : {
    "_id" : 0,
    "tracked_item_type" : "$_id",
    "tracked_item_name" : {
        "$cond" : [
            {
                "$or" : [
                    {
                        "$eq" : [
                            "$all.name",
                            "$numberOne.name"
                        ]
                    },
                    {
                        "$eq" : [
                            "$all.name",
                            "$numberTwo.name"
                        ]
                    }
                ]
            },
            "$all.name",
            null
        ]
    },
    "duration" : {
        "$cond" : [
            {
                "$or" : [
                    {
                        "$eq" : [
                            "$all.name",
                            "$numberOne.name"
                        ]
                    },
                    {
                        "$eq" : [
                            "$all.name",
                            "$numberTwo.name"
                        ]
                    }
                ]
            },
            "$all.dur",
            null
        ]
    }
}
}
match2 = { "$match" : { "tracked_item_name" : { "$ne" : null } } };

इसे अपने नमूना डेटा के साथ चलाना:

db.top2.aggregate(pregroup, sort, group1, unwind, project, match, sort2, group2, unwind2, project2, match2).toArray()
[
    {
        "tracked_item_type" : "Software",
        "tracked_item_name" : "Word",
        "duration" : 9540
    },
    {
        "tracked_item_type" : "Software",
        "tracked_item_name" : "Notepad",
        "duration" : 4000
    },
    {
        "tracked_item_type" : "Site",
        "tracked_item_name" : "Digital Blasphemy",
        "duration" : 8000
    },
    {
        "tracked_item_type" : "Site",
        "tracked_item_name" : "Facebook",
        "duration" : 7920
    }
]

यह डोमेन की मनमानी संख्या (विभिन्न ट्रैक किए गए आइटम प्रकार मान) के साथ काम करेगा और आपको उनके सभी नामों को पहले से जानने की आवश्यकता नहीं है। हालांकि, इसे शीर्ष तीन में सामान्य करने के लिए, शीर्ष चार, शीर्ष पांच, आदि प्रत्येक अतिरिक्त शीर्ष "एन" मान के लिए चार और चरण जोड़ देंगे - बहुत व्यावहारिक या सुंदर नहीं।

एकत्रीकरण ढांचे में "शीर्ष एन" कार्यक्षमता का अधिक मूल कार्यान्वयन प्राप्त करने के लिए कृपया इस जीरा टिकट को वोट दें।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB एक संग्रह से सरणी तत्व खींचता है

  2. MongoDB $gte एकत्रीकरण पाइपलाइन ऑपरेटर

  3. MongoDB oplog को संशोधित करें और फिर से चलाएं

  4. मोंगोडब, शार्डिंग और कई विंडोज़ सेवाएं

  5. Mongoose/node.js कैसे खोजें, पॉप्युलेट करें, सामान करें, 'डिपॉप्युलेट' करें और अपडेट करें