如何使用不可变的Salat案例类更新Mongo中的对象

时间:2012-10-14 12:17:09

标签: scala mongodb playframework-2.0 casbah salat

我正在与Scala,Salat,Casbah,Mongo,Play2,BackboneJS合作开展一个项目...但是同时要学习很多新东西...我很喜欢Scala但是我发现我的代码很糟糕,我真的不知道改进它的解决方案是什么。

基本上我的用例是:

  • 通过Play2
  • 将MongoDB对象发送到浏览器的JS代码
  • JS代码更新对象数据(通过Backbone模型)
  • JS将更新后的JSON发送回服务器(由Backbone保存方法发送,并由Play使用json bodyparser接收)
  • Play收到的JSON应该更新MongoDB中的对象
  • 出于安全原因(object id,creationDate ...)
  • ,某些字段不应该是可更新的

我的问题是最后一部分。 我使用Salat的case类作为MongoDB中存储的对象的表示。

我真的不知道如何处理从JS代码收到的JSON。

  • 我应该将JSON绑定到Salat案例类中,然后让Mongo通过全新的案例类对象覆盖以前的对象数据吗? 如果有,Play2或Salat有办法从收到的JSON中自动创建案例类吗?

  • 我应该使用$ set为我想要更新的字段单独处理我的JSON字段吗?

  • 我应该使我的案例类的元素可变吗?这就是我们在Java中用Hibernate实际做的事情:从DB获取对象,更改其状态并保存它。但它似乎不适合用Scala ...

如果有人可以为我的用例提供一些建议,那就太好了,因为我真的不知道该怎么做:(

编辑:我在这里问了一个相关的问题:Should I represent database data with immutable or mutable data structures?

4 个答案:

答案 0 :(得分:1)

Salat使用lift-json处理JSON - 请参阅https://github.com/novus/salat/wiki/SalatWithPlay2

Play本身使用Jerkson,这是解码模型对象的另一种方法 - 请参阅http://blog.xebia.com/2012/07/22/play-body-parsing-with-jerkson/以获取示例。

随意制作一个展示您问题的小样本Github项目,并发送到https://groups.google.com/group/scala-salat的Salat邮件列表寻求帮助。

答案 1 :(得分:1)

您需要部分镜头来更新JSON数据结构。 http://dropbox.tmorris.net/media/doc/lenses.pdf

答案 2 :(得分:0)

你的问题确实存在两个问题:

  1. 我如何使用Play Salat。
  2. 如何阻止对某些字段的更新。
  3. 第一个问题的答案在于Play Salat documentation。你的第二个问题可以通过几种方式回答。

    一个。当更新从Backbone推送到服务器时,您可以获取对象ID并在数据库中找到它。此时,您拥有该对象的两个副本。此时,您可以触发业务规则以确保发件人不会尝试更改这些字段。

    湾您可以将一些字段放在嵌入文档的另一个文档中。客户端可以访问它们以进行渲染,但是您的API不允许将它们推回到Mongo。

    ℃。您可以编写一个自定义更新查询,忽略您不想更改的字段。

答案 3 :(得分:0)

实际上答案很简单:我不知道在案例类中有一个内置的复制方法,允许在更改某些数据时复制不可变的案例类。

我没有嵌套的案例类结构,但Tony Morris建议使用镜头也很好。