2011-04-07 17 views
8

मैं कैस्बा के साथ ऑब्जेक्ट आईडी द्वारा खोजने के लिए एक प्रश्न लिखने की कोशिश कर रहा हूं, यह मामूली लगता है लेकिन ... मुझे नहीं मिला।Casbah के साथ MongoDB पर ऑब्जेक्ट आईडी द्वारा कैसे खोजें?

def get(id: Option[String]): User = { 
    val mongoDB : MongoDB = MongoConnection().apply("test") 
    val mongoColl : MongoCollection = mongoDB.apply("users") 
    val objectId = id.getOrElse().asInstanceOf[String] 
    val o : DBObject = MongoDBObject("_id" -> objectId) 
    val u = mongoColl.findOne(o) 
    val user = new User() 
    for(x <- u){ 
     user.id = x.getAs[String]("_id") 
     user.username = x.getAs[String]("username") 
     user.password = x.getAs[String]("password") 
    } 
    user 
} 

और इस:

def get(id: Option[String]): User = { 
     val mongoDB : MongoDB = MongoConnection().apply("test") 
     val mongoColl : MongoCollection = mongoDB.apply("users") 
     val objectId = "ObjectId(\"" +id.getOrElse().asInstanceOf[String] + "\")" 
     val o : DBObject = MongoDBObject("_id" -> objectId) 
     val u = mongoColl.findOne(o) 
     val user = new User() 
     for(x <- u){ 
      user.id = x.getAs[String]("_id") 
      user.username = x.getAs[String]("username") 
      user.password = x.getAs[String]("password") 
     } 
     user 
    } 

यह संकलन और चलाने, लेकिन कोई परिणाम

मैं इस कोशिश की। मैं भी इस की कोशिश की:

def get(id: Option[String]): User = { 
    val mongoDB : MongoDB = MongoConnection().apply("test") 
    val mongoColl : MongoCollection = mongoDB.apply("users") 
    val objectId : ObjectId = id.getOrElse().asInstanceOf[ObjectId] 
    val o : DBObject = MongoDBObject("_id" -> objectId) 
    val u = mongoColl.findOne(o) 
    val user = new User() 
    for(x <- u){ 
     user.id = x.getAs[String]("_id") 
     user.username = x.getAs[String]("username") 
     user.password = x.getAs[String]("password") 
    } 
    user 
} 

लेकिन यह एक संकलन नहीं है क्योंकि स्ट्रिंग ObjectId में ढाला नहीं जा सकता है।

java.lang.ClassCastException: java.lang.String cannot be cast to org.bson.types.ObjectId 

आपकी मदद :) के लिए धन्यवाद

उत्तर

12

"_ id" आम तौर पर MongoDB में एक ObjectID के रूप में संग्रहीत किया जाता है और नहीं एक स्ट्रिंग ... स्ट्रिंग और ObjectID विभिन्न प्रकार हैं और आप एक के लिए एक स्ट्रिंग डाली नहीं कर सकता ObjectId। ऑब्जेक्टआईडी मोंगोडीबी के भीतर भी एक अलग प्रकार है, इसलिए ऑब्जेक्टआईडी ("abcdefgh123") स्ट्रिंग "abcdefgh123" जैसा नहीं है।

आपको यहां Casbah के भीतर ऑब्जेक्ट आईडी द्वारा खोजना होगा। इसके बजाय इसे आजमाएं:

def get(id: Option[ObjectId]): User = { 
    val mongoDB : MongoDB = MongoConnection().apply("test") 
    val mongoColl : MongoCollection = mongoDB.apply("users") 
    val objectId : ObjectId = id.getOrElse().asInstanceOf[ObjectId] 
    id.foreach(oid => { 
     val o : DBObject = MongoDBObject("_id" -> oid) 
     val u = mongoColl.findOne(o) 
     val user = new User() 
     for(x <- u){ 
     user.id = x.getAs[ObjectId]("_id") 
     user.username = x.getAs[String]("username") 
     user.password = x.getAs[String]("password") 
     } 
     user 
    }) 
    } 
+1

ठीक है धन्यवाद @ एमसीएडम्स। अब यह काम कर रहा है! उपयोगकर्ता = { वैल MongoDB: 'डीईएफ़ (: विकल्प [स्ट्रिंग] आईडी) मिलता है। MongoDB = MongoConnection() लागू (" परीक्षण ") वैल mongoColl: MongoCollection = mongoDB.apply (" उन ") वैल objectId : ऑब्जेक्टआईडी = नया ऑब्जेक्ट आईडी (id.getOrElse()। AsInstanceOf [स्ट्रिंग]) वैल उपयोगकर्ता = नया उपयोगकर्ता() वैल ओ: DBObject = MongoDBObject ("_ id" -> objectId) val u = mongoColl.findOne (o) (x <- u) { user.id = x.getAs [स्ट्रिंग] ("_ id") user.fullname = x.getAs [स्ट्रिंग] ("पूर्णनाम") user.username = x.getAs [ स्ट्रिंग] ("उपयोगकर्ता नाम") } उपयोगकर्ता } ' – Remy

+1

आप भी कर सकते हैं mongoColl.findOne (id.get) करो – David

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