我正在尝试将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
}
答案 0 :(得分:1)
我感到很痛苦 - 我还有一个带有句点的MongoDB数据库 - 看起来某些驱动程序的早期版本并没有阻止插入带有句号的非法键名。
问题是所有MongoDB工具(或大多数工具)都不支持使用这些字段,所以它会有点痛苦。我有两个建议给你:
您可以使用mongoexport和
来导出有问题的集合
然后更改文件中有问题的字段。你会希望他们
使用mongoimport将数据导入新的清理集合。
如果文件很小,你可以使用编辑器,如果它很大,你可以
使用像awk或sed这样的东西进行更改 - 文件是
毕竟只是文字。
您可以编写一小段代码来迭代每个代码 文档,修改有问题的字段名称,然后保存 将生成的文档(与现有的ObjectId)合并为一个新的 采集。较慢,但这里的优点是你可以告诉 任意字符串(例如,可变数量的点 每个字段名称)。您选择编码语言,但这将是 在Python中直截了当。
在任何一种情况下,在将数据加载到新集合后,您重命名旧集合,然后使用旧名称重命名新集合,您应该完成。
同意@JohnnyHK您应该长期更改架构,但这至少会清理您拥有的内容,以便在您进行架构更改时可以将其与2.6一起使用。