0

我对如何在我的 Scalatra 项目中使用 Casbah 从 MongoDB 检索单个文档感到有些困惑。目前,我有一些假设如下所示的代码:

get ("/dogs") {
    val collar_id = params.getOrElse("collar_id", 1)
    val mongoColl = mongoDb("pets")("dogs")     
    val o: DBObject = MongoDBObject("collar_id" -> collar_id)
    val b = mongoColl.findOne(o)

    b.json_document
}

在这种情况下,文档b有一个json_document字段,其中包含我需要在响应中呈现为 JSON 的所有数据。问题是,我似乎没有在这里使用 Casbah 正确查询 MongoDB。相当于我如何使用 mongodb 的客户端查询它是:

db.dogs.findOne({collar_id: 5})

编写上面的查询代码以获得类似结果的正确方法是什么?将collar_id 作为字符串或 Int 传递似乎不起作用。返回时也会出错b.json_document

 value json_document is not a member of Option[mongoColl.T]
4

2 回答 2

1

params 是整数还是字符串的映射?如果 varcollar_id是一个字符串,但您在查询时将其存储为 int,它将找不到任何结果。

这是一个确保collar_id基于以下参数的有效 int的示例Map[string, Any]

val collar_id = params.getOrElse("collar_id", "1").toString match {
    case x if x.forall(Character.isDigit) => x.toInt
    case _ => 1
}
于 2013-08-22T08:07:39.397 回答
1

您可以getAs对值使用该方法params

get("/api/dogs/:collarId") {

  val query = for {
    collarId <- params.getAs[Long]("collarId")
    collar <- mongoColl.findOne(MongoDBObject("collar_id" -> collarId))
  } yield collar

  query match {
    case Some(x) => x
    case None => halt(404)
  }

}

这也适用于 scalaz 的\/类型:

get("/api/dogs/:collarId") {

  for {
    collarId <- params.getAs[Long]("collarId") \/> BadRequest()
    collar <- mongoColl.findOne(MongoDBObject("collar_id" -> collarId)) \/> NotFound()
  } yield collar

}
于 2013-08-25T20:54:46.850 回答