हाँ, यह मुमकिन है। असल में यह "ट्वीट" में "उपयोगकर्ता" उप-दस्तावेज़ रखने से भी आसान है। जब "उपयोगकर्ता" एक संदर्भ है, तो यह केवल एक अदिश मान है, 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))}