3

我正在使用reactivemongo。

从 mongodb 读取文档时,我编写了特定于结构的代码。

结构

{
  "name" : "test",
  "age" : 3
}

为了阅读本文,我使用如下代码:

val cursor = collection.find(query).cursor[BSONDocument]
cursor.enumerate.apply(Iteratee.foreach { doc =>
  var name: BSONDocument = doc.getAs[String]("name").get
  var age: BSONDocument = doc.getAs[Int]("age").get
}

所以现在,如果以后,BSON 结构会发生如下变化:

{
  "name" : {
    firstName : "fname",
    lastName : "lname"
  },
  "age" : 3
}

所以现在我必须更改我的代码才能阅读它

val cursor = collection.find(query).cursor[BSONDocument]
cursor.enumerate.apply(Iteratee.foreach { doc =>
  var name: BSONDocument = doc.getAs[BSONDocument]("name").get
  var fname : String  = name.getAs[String]("firstName").get
  var lname : String  = name.getAs[String]("lastName").get
  var age: BSONDocument = doc.getAs[Int]("age").get
}

我想保留当前使用旧结构(即“名称”作为字符串)的数据,并使用新结构(即“名称”作为 BSONDocument)插入新数据。

在读取具有旧结构的文档时,会引发异常“None.get”,因为根据读取方法“名称”应该是 BSONDocument。

我应该如何处理这个问题?

4

1 回答 1

1

这是一个典型的迁移问题。并且有几种方法可以处理迁移。典型的解决方案是:

  1. 迁移数据库中的所有现有文档以适应您的新格式(使用 mongo shell、脚本,或者您甚至可以在启动时将其包含在应用程序中。)。目前没有可以为您完成工作的 mongo 的“自动迁移”插件(我正在开发一个,但尚未完成)。

  2. 让您的应用程序代码了解不同的架构版本。这意味着以接受两个版本的方式编写 BSONDocument 解析逻辑。

于 2013-12-10T10:38:18.953 回答