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

मोंगोडब में के-वी जोड़े के साथ सरणी के रूप में संग्रहीत संपत्ति के भीतर किसी विशिष्ट कुंजी के 'मान' द्वारा कैसे क्रमबद्ध करें

यह मानते हुए कि आप जो चाहते हैं वह सभी दस्तावेज होंगे जिनके पास "अंक" मान सरणी में "कुंजी" के रूप में होगा, और फिर उस "कुंजी" के लिए "मान" पर सॉर्ट करें, तो यह गुंजाइश से थोड़ा बाहर है .find() विधि।

कारण अगर आपने ऐसा कुछ किया है

db.collection.find({
    "setid": 154421, "data.k": "point" }
).sort({ "data.v" : -1 })

समस्या यह है कि भले ही मेल खाने वाले तत्व करते हैं "बिंदु" की मिलान कुंजी है, यह बताने का कोई तरीका नहीं है कौन सा data.v आप इस प्रकार के लिए जिक्र कर रहे हैं। साथ ही, एक sort .find() . के अंदर परिणाम कुछ ऐसा नहीं करेंगे:

db.collection.find({
    "setid": 154421, "data.k": "point" }
).sort({ "data.$.v" : -1 })

जो कोशिश होगा एक प्रकार के भीतर स्थितीय ऑपरेटर का उपयोग करने के लिए, अनिवार्य रूप से यह बताना कि कौन सा तत्व v . के मान का उपयोग करना है पर। लेकिन यह समर्थित नहीं है और होने की संभावना नहीं है, और सबसे संभावित व्याख्या के लिए, कि "इंडेक्स" मान प्रत्येक दस्तावेज़ में अलग-अलग होगा।

लेकिन इस तरह के चुनिंदा छँटाई .aggregate()

db.collection.aggregate([

    // Actually shouldn't need the setid
    { "$match": { "data": {"$elemMatch": { "k": "points" } } } },

    // Saving the original document before you filter
    { "$project": {
        "doc": {
           "_id": "$_id",
           "setid": "$setid",
           "date": "$date",
           "version": "$version",
           "data": "$data"
        },
        "data": "$data"
    }}

    // Unwind the array
    { "$unwind": "$data" },

    // Match the "points" entries, so filtering to only these
    { "$match": { "data.k": "points" } },

    // Sort on the value, presuming you want the highest
    { "$sort": { "data.v": -1 } },

    // Restore the document
    { "$project": {
        "setid": "$doc.setid",
        "date": "$doc.date",
        "version": "$doc.version",
        "data": "$doc.data"
    }} 

])

बेशक यह मान लेता है कि data सरणी में केवल एक . है तत्व जिसमें प्रमुख बिंदु हैं। यदि एक से अधिक थे, तो आपको $group . की आवश्यकता होगी इस तरह से पहले:

    // Group to remove the duplicates and get highest
    { "$group": { 
        "_id": "$doc",
        "value": { "$max": "$data.v" }
    }},

    // Sort on the value
    { "$sort": { "value": -1 } },

    // Restore the document
    { "$project": { 
        "_id": "$_id._id",
        "setid": "$_id.setid",
        "date": "$_id.date",
        "version": "$_id.version",
        "data": "$_id.data"
    }}

तो .aggregate() कुछ जटिल . करने के लिए दस्तावेज़ों को क्रमबद्ध करना और फिर भी मूल दस्तावेज़ परिणाम को पूर्ण रूप से वापस करना।

एकत्रीकरण ऑपरेटरों पर कुछ और पढ़ें और सामान्य रूपरेखा। यह सीखने का एक उपयोगी टूल है जो आपको .find() . से आगे ले जाता है ।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb के साथ अंतिम X मिनट डेटा प्राप्त करने की क्वेरी

  2. Has_many को कैसे कार्यान्वित करें:मोंगोइड और मोंगोडब के साथ संबंधों के माध्यम से?

  3. फ़िल्टर से मेल खाने वाले सरणी के अंतिम तत्व में मान के आधार पर दस्तावेज़ों को क्रमबद्ध करें। मोंगोडब

  4. MongoDB में md5 हैश को कुशलतापूर्वक संग्रहीत करने के लिए सर्वोत्तम अभ्यास

  5. किसी सरणी में किसी ऑब्जेक्ट के तत्व द्वारा खोजें