【问题标题】:Using Casbah in Scala/Scalatra to query for a document在 Scala/Scalatra 中使用 Casbah 查询文档
【发布时间】:2013-08-22 02:43:42
【问题描述】:

我对如何在我的 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]

【问题讨论】:

    标签: mongodb scala scalatra casbah


    【解决方案1】:

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

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

    val collar_id = params.getOrElse("collar_id", "1").toString match {
        case x if x.forall(Character.isDigit) => x.toInt
        case _ => 1
    }
    

    【讨论】:

    • 不管我使用 int 还是 string,都没有想要的行为。
    • 错过了选项部分 - findOne 返回一个 Option 所以你需要调用 .get 来获取实际文档
    【解决方案2】:

    您可以在params 值上使用getAs 方法:

    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
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多