基本上我想要实现的只是在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
的尝试不起作用,因为编译器说filter
和map
不是Any
的成员。
在视图中使用/访问/显示查询结果需要做什么?
(顺便说一句:完整代码在GitHub)
答案 0 :(得分:0)
答案很简单,我不敢相信我之前没有这个想法......
我只需要在视图的第一行添加完整的包名...
@(list: List[com.mongodb.casbah.Imports.DBObject])
..然后我甚至不必导入包。我现在可以单独显示文档的每个属性值,例如@doc.get("_id")
。
如果有人感兴趣,这是full view file。