2011-11-21 11 views
27

मैं विषयों के लिए "टक्कर" सुविधा लागू करना चाहता हूं। एक बार विषय बंप हो जाने पर, इसमें एक नया "bump_date" फ़ील्ड होगा। मैं इसे सॉर्ट करना चाहता हूं ताकि जब "bump_date" फ़ील्ड हो, तो इसे सॉर्ट किया जाएगा जैसे कि यह "बनाया गया" फ़ील्ड था।मोंगो डीबी सॉर्टिंग

{ 
    "text" : "test 1", 
    "created" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 2", 
    "created" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)" 
}, 
{ 
    "text" : "test 3", 
    "created" : "Sun Nov 17 2011 02:03:28 GMT-0800 (PST)", 
    "bump_date: : "Sun Nov 19 2011 02:03:28 GMT-0800 (PST)" 
} 

मैं चाहता हूँ तरह "परीक्षण 1" के क्रम में वापस जाने के लिए, "परीक्षण 3", "परीक्षण 2"

+0

यह मोंगोडीबी सॉर्टिंग के लिए मदद कर सकता है http://www.code-sample.com/2016/07/mongodb-sort-by-date.html –

उत्तर

69

MongoDB में छंटाई की तरह किया जाता है: यहाँ मेरी db.topics का एक उदाहरण है इसलिए:

db.collection.find({ ... spec ... }).sort({ key: 1 })

जहां 1 आरोही जाता है और -1 उतरते है।

अपने विशिष्ट उदाहरण में: db.topics.find().sort({ bump_date: 1 }), हालांकि इसे "अपडेट_ट" जैसे कुछ कॉल करना बेहतर हो सकता है।

आप निश्चित रूप से अपने "bump_date" फ़ील्ड पर एक इंडेक्स भी रखना चाहते हैं।

+2

इसके लिए काम करने के लिए, मुझे लगता है कि ओपी को ' दस्तावेज़ को सहेजते समय पहली बार bump_date' को 'बनाया'। फिर आप सुझाव देते हैं कि आप हमेशा 'bump_date' और उस पर इंडेक्स द्वारा क्रमबद्ध करें। – dcrosta

+1

यह सच है, और शायद बनाया जाना चाहिए ताकि संग्रह अंततः संकलित किया जा सके। या, [स्पैस इंडेक्स] (http://www.mongodb.org/display/DOCS/Indexes#Indexes-SparseIndexes)। –

2

वर्तमान में यह MongoDB में कई columns.eg से अधिक उपयोगकर्ता परिभाषित मानदंडों के आधार पर एक तरह से करने के लिए संभव नहीं है। यहां समारोह bump_date लौट सेट होने पर इससे, और वापस जाने के लिए हो गया होता created

या तो आप यहाँ उल्लेख के रूप में एक सर्वर साइड या क्लाइंट-साइड कोड का उपयोग करना होगा:

Mongo complex sorting?

या आप बुनियादी quering और सॉर्टिंग की सहायता से रहना चाहते हैं, तो आप करेगा:

  • एक महत्वपूर्ण bump_datecreated के बराबर बनाने के लिए जब भी एक नया रिकार्ड बनाया है। यह नहीं डेटा ओवरहेड बनें, क्योंकि आप उम्मीद कर सकते हैं कि भविष्य में थोड़ी देर में आपके प्रत्येक विषय को टक्कर में लाया जाए, इसलिए bump_date फ़ील्ड अंततः जोड़ा जाएगा। तो इसे शुरुआत से ही जोड़ें।

  • जब भी लेख बंप किया जाता है, तो क्षेत्र bump_date फ़ील्ड अपडेट करें। bump_date मैदान पर

    { 
        "text" : "test 1", 
        "created" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)", 
        "bump_date" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)" 
    }, 
    { 
        "text" : "test 2", 
        "created" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)", 
        "bump_date" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)" 
    }, 
    { 
        "text" : "test 3", 
        "created" : "Sun Nov 17 2011 02:03:28 GMT-0800 (PST)", 
        "bump_date: : "Sun Nov 19 2011 02:03:28 GMT-0800 (PST)" 
    } 
    

    आप ensureIndex करेगा:

आपका उदाहरण दस्तावेजों इस परिवर्तन के साथ इस तरह दिखेगा। अब आप आवश्यक डेटा को आसानी से पूछ सकते हैं।

db.topics.find().sort({ bump_date: 1 }) 
+0

क्यों सुनिश्चित करें कि इंडेक्स को bump_date पर लागू किया जाना चाहिए? –

5

जैसा कि ब्रायन हिक्स ने सुझाव दिया था, एक अतिरिक्त अद्यतन_ट फ़ील्ड बनाने का तरीका है। इस तरह, जब कोई दस्तावेज़ बनाया जाता है तो आप create_at और update_at प्रारंभ में वही हो सकते हैं।

{ 
    "created_at": xxx, 
    "updated_at": xxx 
} 

आप तो वर्तमान समय के लिए यह निर्धारित करके "टक्कर" updated_at क्षेत्र हैं जब वहाँ एक एक टक्कर घटना आप updated_at मैदान पर सॉर्ट आदेश देने इच्छा प्राप्त करने के लिए कर सकते हैं।

4
इसके अलावा

:

db.collection.find({ $query: {}, $orderby: { column : -1 } }) 

जहां 1 आरोही जाता है और -1 उतरते है।

संबंधित मुद्दे