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

मोंगोस में एकाधिक फ़ील्ड द्वारा क्रमबद्ध सूची में आइटम रैंकिंग कैसे प्राप्त करें

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

> db.test.drop()
> for (var i = 0; i < 10; i++) db.test.insert({ "x" : i })
> db.test.find({ }, { "_id" : 0 }).sort({ "x" : -1 }).limit(5)
{ "x" : 9 }
{ "x" : 8 }
{ "x" : 7 }
{ "x" : 6 }
{ "x" : 5 }

इस आदेश के लिए, किसी दस्तावेज़ की रैंकिंग { "x" :i } दस्तावेज़ों की संख्या है { "x" :j } i . के साथ

> var rank = function(id) {
    var i = db.test.findOne({ "_id" : id }).x
    return db.test.count({ "x" : { "$gt" : i } })
}
> var id = db.test.findOne({ "x" : 5 }).id
> rank(id)
4

रैंकिंग 0 पर आधारित होगी। इसी तरह, यदि आप दस्तावेज़ के लिए रैंक की गणना करना चाहते हैं { "x" :i } { "x" :1 } . के क्रम में , आप डॉक्स की संख्या गिनेंगे { "x" :j } i> j . के साथ ।

एक मिश्रित प्रकार के लिए, एक ही प्रक्रिया काम करती है, लेकिन इसे लागू करना अधिक कठिन है क्योंकि एक यौगिक अनुक्रमणिका में क्रम लेक्सिकोग्राफिक है, अर्थात, { "a" :1, "b" :1} , (ए, बी) <(सी, डी) अगर ए <सी या ए =सी और बी <डी , इसलिए हमें इस स्थिति को व्यक्त करने के लिए एक अधिक जटिल क्वेरी की आवश्यकता है। यहां एक मिश्रित अनुक्रमणिका के लिए एक उदाहरण दिया गया है:

> db.test.drop()
> for (var i = 0; i < 3; i++) {
    for (var j = 0; j < 3; j++) {
        db.test.insert({ "x" : i, "y" : j })
    }
}
> db.test.find({}, { "_id" : 0 }).sort({ "x" : 1, "y" : -1 })
{ "x" : 0, "y" : 2 }
{ "x" : 0, "y" : 1 }
{ "x" : 0, "y" : 0 }
{ "x" : 1, "y" : 2 }
{ "x" : 1, "y" : 1 }
{ "x" : 1, "y" : 0 }
{ "x" : 2, "y" : 2 }
{ "x" : 2, "y" : 1 }
{ "x" : 2, "y" : 0 }

दस्तावेज़ के लिए रैंक खोजने के लिए { "x" :i, "y" :j } , आपको दस्तावेज़ों की संख्या ज्ञात करनी होगी { "x" :a, "y" :b } क्रम में { "x" :1, "y" :-1 } जैसे कि (i, j) <(a, b) . सॉर्ट विनिर्देश को देखते हुए, यह i . की स्थिति के बराबर है या i =a और जे> बी :

> var rank = function(id) {
    var doc = db.test.findOne(id)
    var i = doc.x
    var j = doc.y
    return db.test.count({
        "$or" : [
            { "x" : { "$lt" : i } },
            { "x" : i, "y" : { "$gt" : j } }
        ]
    })
}
> id = db.test.findOne({ "x" : 1, "y" : 1 })._id
> rank(id)
4

अंत में, आपके मामले में तीन-भाग मिश्रित अनुक्रमणिका

{ "score" : -1, "time" : 1, "bonus" : -1 }

रैंक समारोह होगा

> var rank = function(id) {
    var doc = db.test.findOne(id)
    var score = doc.score
    var time = doc.time
    var bonus = doc.bonus
    return db.test.count({
        "$or" : [
            { "score" : { "$gt" : score } },
            { "score" : score, "time" : { "$lt" : time } },
            { "score" : score, "time" : time, "bonus" : { "$gt" : bonus } }
        ]
    })
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. स्प्रिंग-मोंगो-डेटा अपडेट केवल एक स्थितीय तर्क की अनुमति देता है?

  2. mongodb . में तिथियों के अनुसार समूह

  3. कास्ट टू नंबर मान NaN (प्रकार संख्या) के लिए एक परिकलित फ़ील्ड Mongoose पर पथ पर विफल रहा

  4. क्या होता है जब मोंगोडब स्मृति से बाहर हो जाता है?

  5. 2d भू अनुक्रमणिका के साथ Mongoose स्कीमा में सरणी में ऑब्जेक्ट को सही ढंग से कैसे परिभाषित करें?

© कॉपीराइट http://hi.sqldat.com सर्वाधिकार सुरक्षित