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

MongoDB:किसी अज्ञात कुंजी के साथ किसी ऑब्जेक्ट में दिए गए फ़ील्ड मान दस्तावेज़ खोजें

हालांकि ऐसा लगता है कि आप नेस्टेड सरणियों का उपयोग करने में अपडेट के साथ समस्या के कारण इस संरचना से संपर्क किया है, आपने वास्तव में केवल कुछ और करके एक और समस्या पैदा की है जो वास्तव में समर्थित नहीं है, और वह यह है कि कोई "वाइल्डकार्ड" नहीं है। /em> मानक क्वेरी ऑपरेटरों का उपयोग करके अनिर्दिष्ट कुंजी खोजने की अवधारणा जो इष्टतम हैं।

इस तरह के डेटा को वास्तव में खोजने का एकमात्र तरीका सर्वर पर जावास्क्रिप्ट कोड का उपयोग करके कुंजी को पार करना है $where . यह स्पष्ट रूप से वास्तव में एक अच्छा विचार नहीं है क्योंकि इसके लिए क्रूर बल की आवश्यकता होती है सूचकांक जैसी उपयोगी चीजों का उपयोग करने के बजाय मूल्यांकन, लेकिन इसे निम्नानुसार किया जा सकता है:

db.theses.find(function() {
    var relations = this.relations;
    return Object.keys(relations).some(function(rel) {
        return relations[rel].type == "interpretation";
    });
))

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

खोज में अनुक्रमणिका का लाभ उठाने के लिए डेटा को फिर से तैयार करने पर विचार करना अभी भी बेहतर समाधान है। जहां "रेटिंग" जानकारी को अपडेट करना आवश्यक है, तो मूल रूप से "flatten" प्रत्येक "रेटिंग" तत्व को इसके बजाय केवल सरणी डेटा के रूप में मानने की संरचना:

{
    "_id": "aeokejXMwGKvWzF5L",
    "text": "test",
    "relationsRatings": [
        {
            "relationId": "cF6iKAkDJg5eQGsgb",
            "type": "interpretation",
            "originId": "uFEjssN2RgcrgiTjh",
            "ratingId": 1,
            "ratingScore": 5
        },
        {
            "relationId": "cF6iKAkDJg5eQGsgb",
            "type": "interpretation",
            "originId": "uFEjssN2RgcrgiTjh",
            "ratingId": 2,
            "ratingScore": 6
        }
   ]
}

अब खोजना बिल्कुल आसान है:

db.theses.find({ "relationsRatings.type": "interpretation" })

और निश्चित रूप से स्थितिगत $ ऑपरेटर अब चापलूसी संरचना के साथ प्रयोग किया जा सकता है:

db.theses.update(
    { "relationsRatings.ratingId": 1 },
    { "$set": { "relationsRatings.$.ratingScore": 7 } }
)

बेशक इसका मतलब प्रत्येक "रेटिंग" मान के लिए "संबंधित" डेटा का दोहराव है, लेकिन यह आम तौर पर मिलान की स्थिति से अपडेट होने की लागत है क्योंकि यह सब केवल एक स्तर के सरणी घोंसले के साथ समर्थित है।

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. क्या मुझे मोंगोडब का कनेक्शन बंद करने की ज़रूरत है?

  2. नेवला मॉडल अद्यतन () बनाम सहेजें ()

  3. MongoDb प्रति कॉलम मौजूद है

  4. मैं अपने एक्सप्रेस ऐप की संरचना कैसे कर सकता हूं जहां मुझे केवल एक बार मोंगोडब कनेक्शन खोलने की आवश्यकता है?

  5. mongoose node.js, $lt और $gt के साथ क्वेरी काम नहीं कर रही है