【发布时间】:2017-12-14 16:52:32
【问题描述】:
我试图防止将空值插入我的 mongoDB 集合。有问题的字段如下所示:
MongoDB 字段
"stadiumArr" : [
"Old Trafford",
"El Calderon",
...
]
(映射)案例类示例
case class FormData(_id: Option[BSONObjectID], stadiumArr: Option[List[String]], ..)
Scala 表单示例
object MyForm {
val form = Form(
mapping(
"_id" -> ignored(Option.empty[BSONObjectID]),
"stadiumArr" -> optional(list(text)),
...
)(FormData.apply)(FormData.unapply)
)
}
我也像这样使用Repeated Values functionality in Play Framework:
播放模板
@import helper._
@(myForm: Form[models.db.FormData])(implicit request: RequestHeader, messagesProvider: MessagesProvider)
@repeatWithIndex(myForm("stadiumArr"), min = 5) { (stadium, idx) =>
@inputText(stadium, '_label -> ("stadium #" + (idx + 1)))
}
这保证了数组中是否至少有5个值;仍然会(至少)创建 5 个输入框。但是,如果在提交表单时一个(或多个)输入框为空,则仍将空字符串作为值添加到数组中,例如
"stadiumArr" : [
"Old Trafford",
"El Calderon",
"",
"",
""
]
基于其他一些从/向数据库转换类型的方法;我尝试过一些解决方案;如:
implicit val arrayWrite: Writes[List[String]] = new Writes[List[String]] {
def writes(list: List[String]): JsValue = Json.arr(list.filterNot(_.isEmpty))
}
.. 但这不起作用。关于如何防止将空值插入数据库集合的任何想法?
【问题讨论】:
-
"但这不起作用" ...是什么意思?错误?正如已经提供的那样,定义
Writes[List[String]]对我来说似乎没用。scala> implicitly[Writes[List[String]]].writes(List("foo", "bar")) res1: play.api.libs.json.JsValue = ["foo","bar"] -
在插入 MongoDB 之前只过滤列表。
-
@cchantep - 是的,除非您需要删除如上所述插入的空值,否则它是没用的。奇怪的是不是错误,而是挂起。
-
@AlexeyRomanov - 我正在使用如上所示的隐式值过滤列表
-
顺便说一句,我现在有
def writes(list: List[String]): JsValue = Json.arr(list.filterNot(_.isEmpty).toIndexedSeq)的方法,但这会插入一个数组作为值 - 这意味着我有一个嵌套数组。越来越近
标签: mongodb scala playframework