2011-04-07 57 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

相关问题