【发布时间】: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 不起作用,因为编译器说filter 和map 不是Any 的成员。
如何在视图中使用/访问/显示查询结果?
(顺便说一句:完整代码在GitHub)
【问题讨论】:
标签: mongodb scala playframework playframework-2.2 casbah