2015-10-05 4 views
5

मैं संदेशों की एक मोंगो संग्रह है कि इस तरह दिखता है:मोंगो तरह पर एक गणना की हालत

{ 
    'recipients': [], 
    'unRead': [], 
    'content': 'Text' 
} 

प्राप्तकर्ता उपयोगकर्ता आईडी की एक सरणी है, और अपठित सभी उपयोगकर्ताओं ने अभी नहीं खोला है की एक सरणी है संदेश। यही कारण है कि इरादा के रूप में काम कर रहा है, लेकिन मैं, सभी संदेशों की सूची क्वेरी करने के लिए इतना है कि यह रिटर्न पहले 20 परिणामों की जरूरत है जैसे बिना पढ़े लोगों को पहले कुछ वरीयता देते हुए,:

db.messages.find({recipients: {$elemMatch: userID} }) 
    .sort({unRead: {$elemMatch: userID}}) 
    .limit(20) 

लेकिन वह काम नहीं करता। परिणामों को प्राथमिकता देने का सबसे अच्छा तरीका क्या है कि वे एक निश्चित मानदंड के अनुरूप हैं या नहीं?

उत्तर

5

आपको कुछ मानदंडों से करने के लिए "वजन" परिणाम या एक "प्रकार" भीतर "गणना मूल्य" के किसी भी प्रकार है चाहते हैं, तो आप के बजाय .aggregate() विधि की जरूरत है। यह "अनुमान" की अनुमति देता है मानों $sort आपरेशन में प्रयोग की जाने वाली है, जिसके लिए केवल दस्तावेज़ में एक वर्तमान क्षेत्र में इस्तेमाल किया जा सकता है:

db.messages.aggregate([ 
    { "$match": { "messages": userId } }, 
    { "$project": { 
     "recipients": 1, 
     "unread": 1, 
     "content": 1, 
     "readYet": { 
      "$setIsSubset": [ [userId], "$unread" ] } 
     } 
    }}, 
    { "$sort": { "readYet": -1 } }, 
    { "$limit": 20 } 
]) 

यहाँ एक परिवर्तित सरणी के साथ "अपठित" सरणी के तुलना $setIsSubset ऑपरेटर की अनुमति देता है [userId] का यह देखने के लिए कि कोई मिलान है या नहीं। नतीजा या तो true होगा जहां उपयोगकर्ता आईडी मौजूद है या false जहां यह नहीं है।

यह तो $sort के लिए पारित किया जा सकता है, जो मैचों (तरह शीर्ष पर है true decending) को वरीयता के साथ परिणामों को आदेश, और अंत में $limit सिर्फ राशि निर्दिष्ट करने के लिए परिणाम देता है।

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

भी ध्यान रखें कि $elemMatch सिर्फ एक सरणी के भीतर किसी एकल मान से मेल करने की आवश्यकता नहीं है, और आप केवल सीधे मान निर्दिष्ट की जरूरत है। इसका उद्देश्य यह है कि "एकाधिक" स्थितियों को एक एकल सरणी तत्व पर पूरा करने की आवश्यकता है, जो निश्चित रूप से यहां लागू नहीं होता है।

+0

यह पूरी तरह से काम किया। धन्यवाद! एकमात्र टिप्पणी जो मैं करूँगा वह यह है कि मोंगो ने एक त्रुटि फेंक दी जब तक कि मैंने $ setIsSubSet को $ setIsSubset में बदल दिया। – beatniknight

+0

@beatniknight विशिष्ट मुझे। प्रलेखन लिंक सही था लेकिन मेरा ऊंट का मस्तिष्क यह कहता रहता है कि यह दो शब्द है और इसे इस तरह टाइप करना जारी रखता है। –

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