2012-05-06 8 views
7

से डेटा प्राप्त करना ठीक है, तो यहां कैसाबा और मोंगोडीबी की मूल बातें पर एक और सवाल है। डेटाबेस से डीबीओब्जेक्ट को पुनः प्राप्त करने के बाद, मैं इससे कुछ डेटा कैसे निकालूं? मुझे पता है कि DBObject.get() विधि है, जो java.lang.Object लौटाती है। क्या मुझे ऐसा करना है और फिर डेटा को आवश्यक प्रकार में डालना है? मुझे यकीन नहीं है कि यह करने का यह सबसे अच्छा तरीका है ... क्या कोई इसे बेहतर तरीके से करने के लिए सिफारिश कर सकता है?कैस्बा स्कैला मोंगोडीबी चालक - एक डीबीओबीजेक्ट

अद्यतन:

अंत में मैं मैन्युअल रूप से सब सामान से निपटने के रास्ते चला गया। मैं केस क्लास सीमा के कारण सलात का उपयोग नहीं कर रहा हूं क्योंकि बच्चों के लिए केस कक्षाओं की सिफारिश नहीं की जाती है और इसके लिए वास्तुशिल्प पुनर्गठन की आवश्यकता होती है। हालांकि, उत्तर को सबसे अच्छे उत्तर के रूप में चिह्नित किया गया है, क्योंकि यह ज्यादातर स्थितियों में काम करेगा और यहां कोई और सामान्य उत्तर नहीं है।

उत्तर

11

आप MongoDBObject के as विधि का उपयोग कर सकते हैं मूल्य मिलता है और एक कॉल में यह कास्ट करने के लिए:

val coll = MongoConnection()(dbName)(collName) 
val query = MongoDBObject("title" -> "some value") 
val obj = coll findOne query 

val someStr = obj.as[String]("title") 
val someInt = obj.as[Int]("count") 
// and so on.. 

ध्यान दें कि as एक अपवाद है, तो फेंकता दी गई कुंजी नहीं मिल सकती है। आप getAs जो आप Option[A] देता है का उपयोग हो सकता है:

obj.getAs[String]("title") match { 
    case Some(someStr) => ... 
    case None => ... 
} 

निकाला जा रहा है सूचियों में थोड़ा और अधिक जटिल है:

val myListOfInts = 
    (List() ++ obj("nums").asInstanceOf[BasicDBList]) map { _.asInstanceOf[Int] } 

मैं एक सहायक है, जो Casbah अधिक consice का उपयोग कर बनाता है लिखा है, हो सकता है यह उपयोगी होगा, इसलिए मैं इसे संलग्न:

package utils 

import com.mongodb.casbah.Imports._ 

class DBObjectHelper(underlying: DBObject) { 

    def asString(key: String) = underlying.as[String](key) 

    def asDouble(key: String) = underlying.as[Double](key) 

    def asInt(key: String) = underlying.as[Int](key) 

    def asList[A](key: String) = 
    (List() ++ underlying(key).asInstanceOf[BasicDBList]) map { _.asInstanceOf[A] } 

    def asDoubleList(key: String) = asList[Double](key) 
} 

object DBObjectHelper { 

    implicit def toDBObjectHelper(obj: DBObject) = new DBObjectHelper(obj) 

} 

आप इस तरह सहायक का उपयोग कर सकते हैं:

val someStr = obj asString "title" 
val someInt = obj asInt "count" 
val myDoubleList = obj asDoubleList "coords" 

मुझे उम्मीद है कि यह आपकी मदद करेगा।

+0

वाह के साथ काम नहीं करता है जो विषय को बहुत अच्छी तरह से कवर करता है! धन्यवाद, यह स्पष्ट रूप से अब सबसे अच्छा जवाब के रूप में चुना गया है। – noncom

+0

मुझे 'वैल्यू मिलता है जैसे विकल्प 'coll.T]' का सदस्य नहीं है 'val obj = coll.findOne (query) को कॉल करते समय; वैल str = obj.getAs [स्ट्रिंग] ("myValue") '। –

+0

उदाहरण काम नहीं करता है, 'ढूंढें' एक 'विकल्प' प्रकार देता है। – andyczerwonka

2

यदि आप अतिरिक्त निर्भरताओं का उपयोग करने से डरते नहीं हैं, तो Salat का उपयोग करें। सलात के साथ केस क्लास को डेटाबेस ऑब्जेक्ट और बैक में डालना वाकई आसान है।

क्रमबद्धता

val dbo = grater[Company].asDBObject(company) 

अक्रमांकन

val company_* = grater[Company].asObject(dbo) 
+0

हाँ, मुझे सलात के बारे में पता है ... निर्भरताओं का उपयोग करने से डर नहीं, लेकिन कुछ परेशानी केवल केस-क्लास द्वारा प्रस्तुत की जा सकती है। यदि कोई अन्य सार्थक उत्तर नहीं होगा, तो मुझे सलात में देखना होगा ... लेकिन केस-क्लास आर्किटेक्चर बदलने के लिए कुछ ज़रूरत पैदा कर सकते हैं। – noncom

+0

यह स्कैला 2.10 – expert

संबंधित मुद्दे