2011-04-07 18 views
8

我試圖寫一個查詢通過對象ID與Casbah查找,它似乎微不足道,但...我沒有找到。如何使用Casbah查找MongoDB上的對象ID?

我嘗試這樣做:

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」通常被存儲爲對象ID在MongoDB中,而不是一個字符串...字符串和對象ID是不同的類型,你可以不投String到的ObjectId。 ObjectId在MongoDB中也是一個不同的類型,因此ObjectId(「abcdefgh123」)與字符串「abcdefgh123」不一樣。

您需要在Casbah內通過ObjectID進行搜索。試試這個:

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

好的,謝謝@McAdams。現在它工作了! 'DEF得到(ID:選項[字符串]):用戶= { VAL MongoDB的:的MongoDB = MongoConnection()應用( 「測試」) VAL mongoColl:MongoCollection = mongoDB.apply( 「用戶」) VAL的ObjectID :ObjectId = new ObjectId(id.getOrElse()。asInstanceOf [String]) val user = new User() val o:DBObject = MongoDBObject(「_ id」 - > objectId) val u = mongoColl.findOne(o) (x <-u){user.id = x.getAs [String](「_ id」) user.fullname = x.getAs [String](「fullname」) user.username = x.getAs [字符串](「用戶名」) } 用戶 }' – Remy 2011-04-08 01:00:32

+1

您也可以做mongoColl.findOne(id.get) – David 2011-04-15 05:39:36

相關問題