我使用json和reactiveMongo制作了一个小应用程序 学生信息。
object Applications extends Controller{
val studentDao = StudentDaoAndEntity
val studentqueryReader: Reads[JsObject] = implicitly[Reads[JsObject]]
def saveStudent = Action.async(parse.json) { request =>
request.body.validate[StudentInfo].map {
k => studentDao.insertStudent(k).map {
l => Ok("Successfully inserted")
}
}.getOrElse(Future.successful(BadRequest("Invalid Json"))
数据库
object StudentDaoAndEntity {
val sreader: Reads[StudentInfo] = Json.reads[StudentInfo]
val swriter: Writes[StudentInfo] = Json.writes[StudentInfo]
val studentqueryReader: Reads[JsObject] = implicitly[Reads[JsObject]]
def db = ReactiveMongoPlugin.db
def collection: JSONCollection = db[JSONCollection]("student")
def insertStudent(student: StudentInfo): Future[JsObject]= {
val modelToJsObj = swriter.writes(student).as[JsObject]
collection.insert(modelToJsObj) map (_ => modelToJsObj)
}
这很好用。现在我需要获取我插入的所有数据。我怎么能够 去做?我不是要求代码而是要求Idea。
答案 0 :(得分:0)
首先:您似乎正在使用Play-ReactiveMongo(据我所知,JSONCollection
不属于ReactiveMongo本身)。如果是这种情况,那么您的代码就不必要了。您可以直接将StudentInfo
个对象直接传递给insert
,而不是手动执行JSON转换。最小的例子:
val studentInfo: StudentInfo = ...
def collection: JSONCollection = db[JSONCollection]("student")
collection.insert(studentInfo)
这是Play插件的优雅部分。是的,MongoDB将数据保持为JSON(或BSON,更准确),但您没有处理它。只需确保隐式Writes
(或查询时为Reads
)在范围内,以及其他必要的导入(例如play.modules.reactivemongo.json._
)。
现在我需要获取我插入的所有数据。我怎样才能做到这一点?我是 不是要求代码,而是为了想法。
嗯,你想看一下documentation(向下滚动以查看示例),它非常简单,而且没有更多内容。在您的情况下,它可能如下所示:
// perform query via cursor
val cursor: Cursor[StudentInfo] =
collection.find(Json.obj("lastName" -> "Regmi")).cursor[StudentInfo]
// gather results as list
val futureStudents: Future[List[StudentInfo]] = cursor.collect[List]()
在这种情况下,您将获得姓氏为 Regmi 的所有学生。如果您确实想要检索所有学生,那么您可能需要传递一个空的JsObject
作为您的查询。同样,只要隐式Reads
在范围内,就没有必要处理JSON转换。
答案 1 :(得分:0)
包裹控制器
def findAll = Action.async {
val cursor = Json.obj()
StudentDaoAndEntity.findAllStudent(cursor) map {
case Nil => Ok("Student Not Found")
case l:Seq[JsObject] => Ok(Json.toJson(l))
}
}
def findAllStudent(allStd:JsObject):Future [Seq [JsObject]] = {
// gather all the JsObjects in a list
collection.find(allStd).cursor[JsObject].collect[List]()
}