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