2012-10-08 29 views
0

我们使用mongodb,并用scala重写我们的堆栈的一部分。我想知道是否应该坚持使用mophia,或者使用scala mongodb库(如子集)。Scala与Mongodb的集成

问题是什么我摆脱子集?例如与mophia我不必手动定义mongodb字段的名称,就像我在子集中所做的那样...

子集真的值得使用吗?

+0

我敢肯定你必须在Morphia中定义模型,才能使用它来映射到对象。没有时间给出正确的答案,但是这里有一个快速评论:我没有使用子集 - 只有萨拉特,有些东西只有casbah。在我看来,单纯的scala风格的语法要比试图强化Morphia成scala更好。 –

+0

是啊,在你必须定义的模型中,但子集要求你定义单个字段的映射,其中吗啡反省模型类。 – Dzhu

+0

听起来像salat优于子集,在这种情况下。 –

回答

0

在Scala中,您应该考虑使用Casbah,这是一个官方支持的基于Java驱动程序的MongoDB接口。

Casbah的方法是为了在MongoDB之上添加流动的,Scala友好的语法并处理常见类型的转换。如果您尝试将Scala List或Seq保存到MongoDB,我们会自动将其转换为Java驱动程序可以序列化的类型。如果您阅读Java类型,我们会在它碰到您的代码之前将其转换为可比较的Scala类型。所有这些旨在让您专注于使用Scala语言编写最好的Scala代码。为了向您提供您期望从Scala获得的功能性和隐式转换工具,以及MongoDB的强大功能和灵活性,我们付出了巨大的努力。

Casbah提供了改进的GridFS,Map/Reduce和核心Mongo API接口。它还提供了模拟内部DSL的流体查询语法,并允许您编写看起来像您可能在JS Shell中编写的代码。还支持轻松添加常用数据类型的新序列化/反序列化机制。

+0

用于casbah的DSL很酷,对scala来说它很好用。然而,morphia的目标是从mongo文档中进行对象映射,其中casbah更像是java驱动程序,只是让您访问可以将基元(或嵌套映射)拉出来的映射 - 完全不用于构建对象映射-在。这就是为什么很多人在casbah(甚至morphia或jackson-mapper - 面向java的映射器)上使用salat或子集。 –

0

除了ORM映射器/客户端库,我建议你试试Rouge。它会为Mongo提供一个很好的Query DSL。 Rogue 1.X将只支持Lift-MongoDB,但版本2.x(将在不久的将来发布)将适用于更多的MongoDB库。

样品查询将是(纯Scala代码与编译时类型检查):

Venue where (_.mayor eqs 1234) and (_.categories contains "Thai") fetch(10) 

哪些查询的地点集合,其中1234是市长和泰国是其类别中的一种在10个条目。

3

我们使用casbah + salat,它几乎适用于所有情况。

+0

salat无法使用2.10 – expert

+0

目前没有用于2.10的稳定版本,您可以试试1.9.2-SNAPSHOT。我们在生产中使用它,它也运行得很好。 –

+0

我试过了:https://github.com/novus/salat/issues/83 – expert

0

我是子集的作者。我会说“子集”实际上不是一种ORM库。它没有使用数据库和集合的方法,而是将其留给Java/Scala驱动程序。但它更侧重于MongoDB文档的转换。这种转换核心是相当通用的,不仅适用于字段的读/写,而且适用于需要执行的应用,例如,文档迁移也是如此。查询/更新构建器子集提供构建在此“核心”之上。

这就是说,如果你需要ORM,确实有更简单的选择。我从来没有意图让Subset与真正的ORM库竞争,我填补了我在项目中遇到的空白。

+0

能否请你提供一个将DBObject映射到案例类的例子?我在文档中通过了'Extractors',但它只显示了映射到单个字段。谢谢! – expert

+0

这可能值得一个单独的问题? –