【问题标题】:How to pass a Casbah result to view in Play Framework?如何传递 Casbah 结果以在 Play Framework 中查看?
【发布时间】:2014-02-02 12:13:17
【问题描述】:

基本上我想要实现的只是在 Play Framework 2.2 控制器中使用 Casbah 执行 MongoDB 查询,将结果传递给视图并以 HTML 形式呈现结果。

我认为我的主要问题是,我不知道如何定义视图的参数,因为视图不知道我尝试过的任何结果类型,并且下面一行中的 @import 不知道似乎也有帮助。

控制器动作:

def read = Action {
    val mongoClient = MongoClient("localhost", 27017)
    val db = mongoClient("sampleapp")
    val coll = db("testcoll1")

    // Query: get all documents
    val docs = coll.find() // Type: coll.CursorType
    val list = docs.toList

    Ok(views.html.casbahsamples.read(list))
}

如您所见,我尝试将结果转换为List,因为docs 似乎是coll.CursorType 类型,其中coll 是我的值的名称,当它传递给视图时,我不知道如何在参数行中使用它,因为编译器要求输入 coll.CursorType 类型,但甚至不知道 coll

无论如何,如果我在视图中为我的列表参数声明类型 List[Any],这将部分起作用,但我将无法访问结果文档的任何属性,因为这些方法都不适用于对象类型为Any

我认为,最好的方法是在视图的参数行中声明List[BasicDBObject],但BasicDBObject 不是已知类型。所以我尝试在下面的行中导入它(据我所知,这是视图中唯一允许导入的地方)。但这并没有改变任何东西。

查看:

@(list: List[BasicDBObject])

@import com.mongodb.BasicDBObject

@* also tried:
@import com.mongodb.casbah.Imports._
*@

<h2>Query results</h2>

<h3>Number of query results:</h3>
<p>@list.length</p>

<h3>Results:</h3>
<code>@list</code><!-- this will be a JSON string representation, but that's not what I want -->

<h4>List:</h4>
@import java.math.BigInteger; var i = 0;
@for(doc <- list) {
    @{i += 1; i}:<br>
    @*
    doc is of type BasicDBObject as I found out doing this:
    @doc.asInstanceOf[AnyRef].getClass.getSimpleName
    *@
    @doc

@* The next line results in a compilation error: value filter is not a member of Any *@
@defining(doc.filter(_.isInstanceOf[BasicDBObject]).map(_.asInstanceOf[BasicDBObject])) { docX =>
    @docX.asInstanceOf[AnyRef].getClass.getSimpleName
}

    <br><br>
    <dl style="background: #ccc">
        <dt>_id</dt>

        @* doc will be of type BasicDBObject *@
        @* <dd>@doc.getString("pie")</dd> *@
        @* <dd>@docX.getString("pie")</dd> *@
    </dl>
    <br><br>
}

我尝试将Any 转换为BasicDBObject 不起作用,因为编译器说filtermap 不是Any 的成员。

如何在视图中使用/访问/显示查询结果?

(顺便说一句:完整代码在GitHub

【问题讨论】:

    标签: mongodb scala playframework playframework-2.2 casbah


    【解决方案1】:

    这个问题的答案太简单了,我不敢相信我之前没有这个想法……

    我只需要在视图的第一行添加完整的包名...

    @(list: List[com.mongodb.casbah.Imports.DBObject])
    

    ..然后我什至不必导入包。我现在可以分别显示文档的每个属性值,例如@doc.get("_id").

    如果有人感兴趣,这里是full view file

    【讨论】:

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