【发布时间】:2018-05-05 07:41:01
【问题描述】:
我真的很纠结scala 中的类型关系 以及如何有效地使用它们。我目前正在尝试了解如何使用它们仅编辑 Mongo 集合 中的某些字段。这意味着将仅包含这些字段的特定 object 传递给一个方法(在阅读 about variances 之后)我认为我可以这样做:
abstract class DocClass
case class DocPart1(oId: Option[BSONObjectID], name: String, other: String) extends DocClass
case class DocPart2(city: String, country: String) extends DocClass
使用调用更通用方法的方法为:
def updateMultipleFields(oId: Option[BSONObjectID], dataModel: DocClass): Future[Result] = serviceClientDb.updateFields[T](collectionName, dataModel, oId)
// updateFields updates the collection by passing *dataModel* into the collection, i.e. Json.obj("$set" -> dataModel)
所以dataModel 可以是DocPart1 或DocPart2 对象。我急于不使用
type parameter 在updateMultipleFields 上(正如interesting article 可能建议的那样),因为这导致我在将这些传递给项目中其他文件中的此方法时遇到更多问题。我这样做是为了遵守 DRY 并维护高效的数据库操作。
我在这个问题上转了一圈 - 任何人都可以对此有所了解吗?
在@SerGr 的 cmets 之后编辑
所以要完全清楚;我正在使用 Play/Scala/ReactiveMongo Play JSON(documented here),并且我有一个包含很多字段的 MongoDB 集合。
case class Doc(oId: Option[BSONObjectID], name: String, city: String, country: String, city: String, continent: String, region: String, region: String, latitude: Long, longitude: Long)
要创建一个新文档,我已将 Doc(上图)自动映射到集合结构(在 Play - like this)并创建了一个表单(以插入/更新 集合) - 一切正常!
但是在编辑文档时;我只想更新一些字段(这样所有字段都不会更新)。因此,我创建了多个case classes 将这些字段划分为更小的模型(如DocPart1 和DocPart2 的示例)并将表单数据映射到一个。这导致我将这些作为参数传递给updateMultipleFields 方法,如上所示。我希望这更有意义。
【问题讨论】:
-
不清楚你想要什么。您是否有一个对象和几组在不同场景中更新的不同字段,并且您希望将每个这样的集合分组为显式类型?或者您是否有一些集合,出于某种原因存储了应该以不同方式更新的不同类型的对象?或者这种代码还有其他场景吗?
-
@SerGr - 感谢您的回复。请参阅 cmets,如果您需要进一步说明,请告诉我。 ATB
-
耶稣,你能不能说一下你用什么库来访问 Mongo?了解它为此类部分更新提供的 API 非常重要。
-
@SerGr - 我使用 ReactiveMongo Play JSON 作为documented here
标签: scala types polymorphism covariance subtype