我正在尝试将MongoDB 2.4数据库升级到2.6。我进行了升级检查,并收到很多错误消息,告诉我我的字段名称无效。
Document Error: document is no longer valid in 2.6 because DottedFieldName: my@gmail#com.test.coddington.us is not valid for storage.
我正在尝试在文档上运行$ rename操作,但是我认为处理无效字段有麻烦。但是,这些字段以某种方式进入了文档,所以我希望现在有一种引用它们的方法。这是我正在运行的命令:
db.Activity.update({"_id" : ObjectId("5123b2d879d0cdf12e62da99")}, { $rename: {"my@gmail#com.test.coddington.us": "my@gmail#com#test#coddington#us"} })
我认为可以通过使用\.
而不是来解决问题,.
但这没有任何区别。我还尝试通过Unicode表示引用字段名称的句点\u002e
。我也没有运气。
db.Activity.update({"_id" : ObjectId("5123b2d879d0cdf12e62da99")}, { $rename: {"my@gmail#com\u002etest\u002ecoddington\u002eus": "my@gmail#com#test#coddington#us"} })
我知道$ rename在数组上不起作用,但这似乎就像一个嵌入式文档,很难正确访问。
有谁知道我应该如何访问此字段以对其重命名?
作为参考,这是文档本身的摘要,因此您可以了解其布局。
{
"_id": ObjectId("5123b2d879d0cdf12e62da99"),
"deliveryStatuses": {
"my@gmail#com.test.coddington.us": "sent"
},
"version": 1
}
我感到很痛苦-我也有一个MongoDB数据库,其中包含带句点的键-似乎某些驱动程序的早期版本并未阻止插入带有句点的非法键名。
问题是所有的MongoDB工具(或其中的大多数)都不支持使用字段,因此有点麻烦。我为您提供两个建议:
您可以使用mongoexport导出有问题的集合,
然后更改文件中有问题的字段。您可能希望他们
使用mongoimport将数据导入到新的清理集合中。如果文件很小,则可以使用编辑器;如果文件很大,则可以使用awk或sed之类的东西来进行更改-该文件毕竟只是文本。
您可以编写一小段代码来遍历每个文档,修改有问题的字段名称,然后将结果文档(带有现有的ObjectId)保存到新的集合中。速度较慢,但优点是您可以使用任意字符串(例如,每个字段名称中的点数可变)来判断。您选择编码语言,但是在Python中这很简单。
无论哪种情况,在将数据加载到新集合中之后,您都需要重命名旧集合,然后使用旧名称重命名新集合,然后您应该完成操作。
同意@JohnnyHK,您应该长期更改架构,但这至少会清理您拥有的内容,以便在进行架构更改时可以在2.6中使用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句