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

MongoDB दायरे सिंक में मॉडलिंग उप-संग्रह

आपका कोड बहुत अच्छा लग रहा है और आप सही दिशा में जा रहे हैं, इसलिए यह उत्तर हार्ड कोड की तुलना में मॉडलिंग पर अधिक स्पष्टीकरण और सुझाव है।

सबसे पहले, दायरे की वस्तुएं हैं आलसी भरी हुई जिसका अर्थ है कि वे केवल उपयोग किए जाने पर लोड होते हैं। डिवाइस मेमोरी पर दसियों हज़ार ऑब्जेक्ट्स का बहुत कम प्रभाव पड़ेगा। तो मान लीजिए कि आपके पास 10,000 उपयोगकर्ता हैं और आप उन सभी को 'लोड इन' करते हैं

let myTenThousandUsers = realm.objects(UserClass.self)

मेह, कोई बड़ी बात नहीं। हालांकि, ऐसा करना

let someFilteredUsers = myTenThousandUsers.filter { $0.blah == "blah" }

समस्या पैदा करेगा (कर सकता है) - अगर वह 10,000 उपयोगकर्ताओं को लौटाता है वे सभी मेमोरी में लोड हो गए हैं संभवतः डिवाइस पर भारी पड़ रहा है। यह एक स्विफ्ट फ़ंक्शन है और स्विफ्ट का उपयोग करके 'कन्वर्ट' करने वाले आलसी डेटा को आमतौर पर टाला जाना चाहिए (केस पर निर्भर उपयोग करें)

स्विफ्ट .forEach

. का उपयोग करके इस कोड का अवलोकन
realm.objects(Project.self).forEach { (project) in
   // Access fields     
}

उन प्रोजेक्ट ऑब्जेक्ट्स के साथ क्या किया जा रहा है, इसके आधार पर समस्याएं पैदा कर सकता है - उन्हें तालिका के रूप में उपयोग करना डेटा देखें यदि उनमें से बहुत सारे हैं तो स्रोत परेशानी हो सकती है।

दूसरी बात प्रति दस्तावेज़ 16Mb सीमा के बारे में प्रश्न है। स्पष्टता के लिए एटलस दस्तावेज़ यह है

{
   field1: value1,
   field2: value2,
   field3: value3,
   ...
   fieldN: valueN
}

जहां मूल्य बीएसओएन डेटा प्रकारों में से कोई भी हो सकता है जैसे कि अन्य दस्तावेज़, सरणियाँ और दस्तावेज़ों की सरणियाँ।

आपकी संरचना में, var tasks = RealmSwift.List<Task>() जहां टास्क एक एम्बेडेड ऑब्जेक्ट है . जबकि अवधारणात्मक रूप से एम्बेडेड वस्तुएं वस्तुएं हैं, मेरा मानना ​​​​है कि वे एक दस्तावेज़ सीमा की ओर गिनती करते हैं क्योंकि वे एम्बेडेड हैं (अगर मैं गलत हूं तो मुझे सुधारें); जैसे-जैसे उनकी संख्या बढ़ती है, संलग्न दस्तावेज़ का आकार बढ़ता जाता है - यह ध्यान में रखते हुए कि 16Mb टेक्स्ट एक विशाल टेक्स्ट है, जो प्रति प्रोजेक्ट लाखों कार्यों के बराबर/बराबर हो सकता है।

सरल उपाय यह है कि उन्हें एम्बेड न करें और उन्हें अपने आप खड़ा कर दें।

class Task: Object {
    @objc dynamic var _id: String = ObjectId.generate().stringValue
    @objc dynamic var _partition: String = "" 
    @objc dynamic var name: String = ""
    @objc dynamic var status: String = "Pending"
    override static func primaryKey() -> String? {
        return "_id"
    }
}

फिर हर एक 16Mb का हो सकता है, और एक 'असीमित संख्या' को किसी एकल प्रोजेक्ट के साथ जोड़ा जा सकता है। एम्बेडेड ऑब्जेक्ट्स का एक फायदा कैस्केड डिलीट का एक प्रकार है, जहां जब पैरेंट ऑब्जेक्ट को हटा दिया जाता है, तो चाइल्ड ऑब्जेक्ट भी होते हैं, लेकिन प्रोजेक्ट से टास्क तक 1-कई संबंधों के साथ - माता-पिता से संबंधित कार्यों का एक गुच्छा हटाना आसान होता है।

ओह - एम्बेडेड ऑब्जेक्ट्स का उपयोग न करने का एक और मामला - विशेष रूप से इस उपयोग के मामले के लिए - क्या उनके पास अनुक्रमित गुण नहीं हो सकते हैं। इंडेक्सिंग कुछ प्रश्नों को बहुत तेज़ कर सकता है।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongodb . में 2 दशमलव स्थानों तक गोलाई

  2. क्या मोंगो के समूह एकत्रीकरण के बाद _id फ़ील्ड का नाम बदलना संभव है?

  3. मैंगो शेल के साथ मोंगोडब में दस्तावेज़ संरचना बदलें

  4. उल्का ऐप - एक तैनात ऐप के डीबी को रीसेट करना

  5. MongoDB - आंशिक स्ट्रिंग के आधार पर अलग-अलग मान कैसे खोजें?