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

MongoDB दस्तावेज़ों को प्रकार के साथ वर्ग में मैप करना लेकिन एम्बेडेड दस्तावेज़ों के बिना

हाँ, यह मुमकिन है। असल में यह "ट्वीट" में "उपयोगकर्ता" उप-दस्तावेज़ रखने से भी आसान है। जब "उपयोगकर्ता" एक संदर्भ है, तो यह केवल एक अदिश मान है, MongoDB और "सबसेट" में उप-दस्तावेज़ फ़ील्ड को क्वेरी करने के लिए कोई तंत्र नहीं है।

मैंने आपके लिए कोड का एक सरल रीप्लेबल स्निपेट तैयार किया है (यह मानता है कि आपके पास दो संग्रह हैं - "ट्वीट" और "उपयोगकर्ता")।

तैयारी...

आयात करें वैल उपयोगकर्ता =डीबी getCollection "उपयोगकर्ता"

हमारा उपयोगकर्ता केस क्लास

केस क्लास User(_id:ObjectId, name:String) 

ट्वीट और उपयोगकर्ता के लिए कई फ़ील्ड

वैल सामग्री ="सामग्री"। फ़ील्डऑफ [स्ट्रिंग] वैल उपयोगकर्ता ="उपयोगकर्ता"। फ़ील्डऑफ [उपयोगकर्ता] वैल नाम ="नाम"। फ़ील्डऑफ [स्ट्रिंग]  

यहां और भी जटिल चीजें होने लगती हैं। हमें क्या चाहिए एक ValueReader जो ObjectId getting प्राप्त करने में सक्षम है फ़ील्ड नाम के आधार पर, लेकिन फिर दूसरे संग्रह में जाता है और वहां से किसी ऑब्जेक्ट को पढ़ता है।

इसे कोड के एक टुकड़े के रूप में लिखा जा सकता है, जो सभी चीजों को एक साथ करता है (आप उत्तर इतिहास में इस तरह के एक संस्करण को देख सकते हैं), लेकिन इसे पाठकों के संयोजन के रूप में व्यक्त करना अधिक मुहावरेदार होगा। मान लीजिए हमारे पास एक ValueReader[User] . है जो DBObject . से पढ़ता है :

वैल userFromDBObject =ValueReader({ case DocumentId(id) ~ name(name) => User(id, name)}) 

जो बचा है वह एक सामान्य ValueReader[T] है जो ObjectId . की अपेक्षा करता है और आपूर्ति किए गए अंतर्निहित पाठक का उपयोग करके किसी विशिष्ट संग्रह से ऑब्जेक्ट पुनर्प्राप्त करता है:

वर्ग RefReader[T](val संग्रह:DBCollection, val अंतर्निहित:ValueReader[T]) ValueReader[T] का विस्तार करता है {ओवरराइड def अनपैक (o:Any):Option[T] =o match { केस आईडी :ObjectId => विकल्प (संग्रह findOne id) फ्लैटमैप {underlying.unpack _} केस _ => कोई नहीं}} 

फिर, हम उपयोगकर्ता . पढ़ने के लिए हमारी टाइप क्लास कह सकते हैं संदर्भों से केवल

. है
अंतर्निहित वैल userReader =नया RefReader[User](users, userFromDBObject) 

और आप इसका उपयोग इस प्रकार करेंगे:

आयात संग्रह.JavaConverters._tweets.find.iterator.asScala foreach { case Document.DocumentId(id) ~ content(content) ~ user(u) => println("%s - %s by %s ".format(id, content, u))} 


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. काफ्का-स्पार्क संरचित स्ट्रीमिंग का उपयोग करके MongoDB को डेटा भेजने में असमर्थ

  2. लुकअप पाइपलाइन:`$मिलान` स्थानीय क्षेत्र `$in` सरणी जब मूल्य से सरणी है और स्थानीय मूल्य पाया जाना है

  3. MongoDB में पूर्ण-पाठ खोज कैसे करें

  4. MongoDB में लिफ्ट स्टोर BigDecimal

  5. पार्स सर्वर के साथ मोंगो/बीएसओएन ऑब्जेक्ट आईडी का उपयोग करना