我正在使用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。
我应该采用什么方法处理这个问题?
答案 0 :(得分:1)
这是典型的迁移问题。有几种方法可以处理迁移。典型的解决方案是:
迁移数据库中的所有现有文档以适合您的新格式(使用mongo shell,脚本或者您甚至可以在启动时将其包含在应用程序中)。目前没有适用于mongo的“自动迁移”插件可以为您完成工作(我正在开发一个,但尚未完成)。
让您的应用程序代码了解不同的架构版本。这意味着以接受两个版本的方式编写BSONDocument解析逻辑。