如何在Play Framework中传递Casbah结果?

时间:2014-02-02 12:13:18

标签: mongodb scala playframework playframework-2.2 casbah

基本上我想要实现的只是在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参数声明类型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

1 个答案:

答案 0 :(得分:0)

答案很简单,我不敢相信我之前没有这个想法......

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

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

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

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