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

ऐरे फ़ील्ड की लंबाई के आधार पर दस्तावेज़ों को कैसे सॉर्ट करें

आपको यहाँ जो अर्थ प्रतीत होता है वह यह है कि आप अपने परिणामों को "उत्तर" सरणी की "लंबाई" के आधार पर "क्रमबद्ध" करना चाहते हैं, न कि "लंबाई" नामक "संपत्ति" के आधार पर, जैसा कि आपके वाक्यविन्यास का तात्पर्य है। रिकॉर्ड के लिए, वह सिंटैक्स यहां असंभव होगा क्योंकि आपका मॉडल "संदर्भित" है, जिसका अर्थ है कि इस संग्रह के दस्तावेज़ों में सरणी फ़ील्ड के भीतर मौजूद एकमात्र डेटा ObjectId है उन संदर्भित दस्तावेजों के मूल्य।

लेकिन आप इसे .aggregate() का उपयोग करके कर सकते हैं। विधि और $size ऑपरेटर:

Question.aggregate(
    [
        { "$project": {
            "title": 1,
            "content": 1,
            "created": 1,
            "updated": 1,
            "author": 1,
            "answers": 1,
            "length": { "$size": "$answers" }
        }},
        { "$sort": { "length": -1 } },
        { "$limit": 5 }
    ],
    function(err,results) {
        // results in here
    }
)

एक एकत्रीकरण पाइपलाइन चरणों में काम करती है। सबसे पहले, एक $project परिणामों में फ़ील्ड के लिए, जहाँ आप $size . का उपयोग करते हैं निर्दिष्ट सरणी की लंबाई वापस करने के लिए।

अब "लंबाई" वाला एक क्षेत्र है, आप के साथ चरणों का पालन करें। $सॉर्ट करें और $limit जो एक एकत्रीकरण पाइपलाइन के भीतर अपने स्वयं के चरणों के रूप में लागू होते हैं।

दस्तावेज़ के भीतर अपने "उत्तर" सरणी की लंबाई संपत्ति को हमेशा बनाए रखने का एक बेहतर तरीका होगा। इससे अन्य कार्यों के बिना सॉर्ट करना और क्वेरी करना आसान हो जाता है। $inc आप के रूप में ऑपरेटर $push या $pull सरणी से आइटम:

Question.findByIdAndUpdate(id,
    {
        "$push": { "answers": answerId },
        "$inc": { "answerLength": 1 } 
    },
    function(err,doc) {

    }
)

या हटाते समय उल्टा:

Question.findByIdAndUpdate(id,
    {
        "$pull": { "answers": answerId },
        "$inc": { "answerLength": -1 } 
    },
    function(err,doc) {

    }
)

यहां तक ​​​​कि अगर आप परमाणु ऑपरेटरों का उपयोग नहीं कर रहे हैं, तो वही सिद्धांत लागू होते हैं जहां आप "लंबाई" को अपडेट करते हैं जैसे आप साथ जाते हैं। फिर एक प्रकार से क्वेरी करना सरल है:

Question.find().sort({ "answerLength": -1 }).limit(5).exec(function(err,result) {

});

चूंकि संपत्ति पहले से ही दस्तावेज़ में है।

तो या तो इसे .aggregate() . के साथ करें अपने डेटा में कोई बदलाव नहीं किए जाने के साथ, या अपने डेटा को बदलने के लिए हमेशा लंबाई को एक संपत्ति के रूप में शामिल करें और आपकी क्वेरी बहुत तेज़ हो जाएंगी।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. स्प्रिंग डेटा और QueryDSL का उपयोग करके MongoDb क्वेरी पर प्रोजेक्शन

  2. MongoDB में कुल ($ मैच) और खोजने के बीच अंतर?

  3. दिनांक सीमा पर $gt और $lt बाधाओं का उपयोग करके Mongoexport

  4. अपवाद:BSON प्रकार EOO से दिनांक में कनवर्ट नहीं किया जा सकता

  5. Meteor.js और नेवला संगतता