无论结构如何,使用反应性mongo从mongodb读取数据的方法

时间:2013-09-20 07:23:53

标签: reactivemongo

我正在使用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
}

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

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

我应该采用什么方法处理这个问题?

1 个答案:

答案 0 :(得分:1)

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

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

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