28

我收到以下错误(转储 MongoDB 3.2)(恢复 MongoDB 3.4):

Failed: ngivr-dev.ledgerhelpers: error creating indexes for ngivr-dev.ledgerhelpers: **createIndex error:** **The field 'safe' is not valid for an index specification.** Specification: **{ unique: true, name: "ledgerId_1", safe: null, ns: "ngivr-dev.ledgerhelpers", background: true, key: { ledgerId: 1 } }**

看起来安全索引为空。但是我如何将它与 MongoDB 3.4 一起使用?3.2还行。

4

5 回答 5

59

safe=true不是索引规范。

在 MongoDB 的 3.4 以下版本中,可以添加额外的索引规范。这些是由特定驱动程序使用的。

在 3.4 中,mongodb 添加了对索引规范的验证:

确保指定的索引选项有效。以前的版本忽略了无效选项。

这就是为什么你有这个错误。恐怕您需要确保 3.2 版本中的索引没有无效的索引规范,然后执行 mongodump。

正如 kz_sergey 在他的回答中所说,您可以mongorestore使用--noIndexRestore, 应该可以正常工作。

于 2016-12-08T10:20:43.913 回答
21

为什么要恢复索引?--noIndexRestore 并再次创建它们。

于 2016-12-08T10:40:50.707 回答
4

本着 Aymeric 评论的精神,您可以使用此 awk 单行代码替换 .metadata.json 文件中的“安全”属性。

awk -i inplace '{gsub(",\"safe\":null", ""); print}' *.metadata.json

在 MongoDB 导出目录中运行它。这种方法允许您保留索引,但删除“安全”选项。

于 2017-10-30T19:25:25.453 回答
2
find . -type f -name "*.metadata.json" -exec sed -i 's/,"safe":null//g' {} \;

这有效,您将保留索引!它找到当前位置 (.) 中的所有文件,然后根据以下正则表达式使用相同的进程 (exec) 替换文件 (sed -i),这基本上是说所有出现的“安全”:null,什么都没有。

更换 ”。” 参数与存储 mongodb 导出的目录的路径。

于 2018-01-11T08:22:52.120 回答
1

由于我想保留所有索引,并且上述方法都不适用于我的情况,我刚刚编辑了所有*.metadata.json文件并手动删除了所有出现的"safe":true.

背景:我正在使用一个无法升级到 4.x 或更高版本的旧数据库 - 它最初在 3.2 上运行,但没有 mongo 版本在带有 Apple Silicon 的新 Mac 上运行,所以我不得不使用 3.4(第一个版本可用)并从旧 Mac 转储并从新 Mac 恢复。

于 2021-07-20T10:52:38.287 回答