仅将表单提交中更改的值更新到MongoDB

仅将表单提交中更改的值更新到MongoDB,mongodb,scala,playframework,httprequest,insert-update,Mongodb,Scala,Playframework,Httprequest,Insert Update,我一直在Scala的播放框架(2.6)中设置REST API,并尝试使用(Scala)表单但我在试图找到仅更新表单提交时更改的值的最佳实践时遇到了一些困难。我使用过这个(以及其他),它使用HTTP请求补丁,与Routes文件类似: 但是,如果我在我的(播放)模板中为表单操作路由到此,如下所示: @form(action = routes.IndexC.update(collName, oId), 'method -> "patch", ...) case class Coun

我一直在Scala播放框架(2.6)中设置REST API,并尝试使用(Scala表单但我在试图找到仅更新表单提交时更改的值的最佳实践时遇到了一些困难。我使用过这个(以及其他),它使用HTTP请求
补丁
,与Routes文件类似:

但是,如果我在我的(播放)模板中为表单操作路由到此,如下所示:

   @form(action = routes.IndexC.update(collName, oId), 'method -> "patch", ...)
   case class Countries(countryName: String, countryCode: String, currencyCode: String)

   object Countries {

     val form = Form(
       mapping(
         "countryName" -> nonEmptyText,
         "countryCode" -> nonEmptyText,
         "currencyCode" -> nonEmptyText
       )(Countries.apply)(Countries.unapply)
     )

   }
然后,它会出现一个无法定位文件的错误(尝试使用
GET
请求)。我在某个地方读到,如果浏览器不支持HTTP请求的
PATCH
,就会发生这种情况。或者我完全误解了这一点——我们称之为我知识差距的第一部分

另外(我知识差距的第2部分)我正在努力理解如何仅检索表单提交中的值(而不是所有输入框值)。假设我有一个非常简单的Scala模型和表单,如下所示:

   @form(action = routes.IndexC.update(collName, oId), 'method -> "patch", ...)
   case class Countries(countryName: String, countryCode: String, currencyCode: String)

   object Countries {

     val form = Form(
       mapping(
         "countryName" -> nonEmptyText,
         "countryCode" -> nonEmptyText,
         "currencyCode" -> nonEmptyText
       )(Countries.apply)(Countries.unapply)
     )

   }

有没有一种方法可以帮助
bindFromRequest
仅检索那些已更改的输入值(从Mongo数据库集合和那些最初输入表单的值-使用
Countries.form.fill
)。或者,在其他地方用更明智的方法来实现这一目标是否更好?或者,第1部分的解决方案可能使这一点变得无关紧要。非常感谢。

类型为
Form
的对象在表单中的每个字段都会有一些内容(或者
None
,当然,如果它们是可选的)。页面上的表单标记(及其输入)确定http post请求中包括哪些对象
bindFromRequest
将把html输入字段名与表单case类中的字段匹配(粗略地说)。因此,没有自动方法只检测更改的字段。不过这是一个有趣的用例

大声思考:

  • 制作一个包含所有可选字段的表单对象版本,并在
    bindFromRequest
    中检查哪些字段具有值。使用此信息可对仅包含这些字段的数据库进行更新。在前端,仅填充更改的输入。您可能需要一个不属于表单的可见输入,然后是属于表单的特殊可选输入,因此也是帖子的一部分
  • 使用布尔值
    hasChanged
    hasChanged
    类型字段(或其中的
    Seq
    )构建一个新的案例类,前端在检测到更改时对其进行设置。表单对象将映射到这个新的case类,并且在
    bindFromRequest
    中,您可以使用布尔函数智能地构造将要进入数据库的唯一更改字段
  • 首次加载表单时,使用控制器缓存案例类数据的未更改副本。在
    bindFromRequest
    中,将其与缓存的值进行比较,并构建已更改字段的列表
  • 从使用表单和
    bindFromRequest
    切换到使用Ajax。在前端,构造POST对象以仅包含更改的字段。在控制器中,使用JSON读取,其中所有case类字段都是选项(ReadNullable)。然后,控制器可以根据JSON中存在的内容确定填充的内容

  • 就MVC而言,此类表格约束不应由DB授予basics@cchantep-我不完全确定你的意思(可能是打字错误),但如果你想说:“这样的表单绑定不应该意识到DB”-那么就不是了。但这当然不能解决问题。当然,任何见解都是受欢迎的。Thanks@cchantep-您是否有只更新scala表单中修改值的经验?我发现在堆栈溢出中获得任何答案越来越困难。也许有更好的论坛或场所来分享知识(尤其是玩框架/Scala/反应式Mongo)。欢迎提出建议