КАК найти идентификатор объекта на MongoDB с помощью Casbah? - PullRequest
8 голосов
/ 07 апреля 2011

Я пытаюсь написать запрос для поиска по идентификатору объекта с помощью Casbah, это кажется тривиальным, но ... я не нахожу.

Я пробовал это:

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
}

Но этот не компилируется, потому что String не может быть приведен к ObjectId.

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

Спасибо за вашу помощь:)

1 Ответ

12 голосов
/ 07 апреля 2011

"_ id" обычно хранится как ObjectID в MongoDB, а не как String ... String и ObjectID являются разными типами, и вы не можете привести String к ObjectId. ObjectId также является отдельным типом в MongoDB, поэтому ObjectId ("abcdefgh123") НЕ совпадает со строкой "abcdefgh123".

Вам необходимо выполнить поиск по ObjectID здесь, в 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
    })
  }
...