MongoDB 从 3.2 转储,用 3.4 恢复,错误索引 safe = null

MongoDB dump from 3.2, restore with 3.4, error index safe = null

我收到以下错误(转储 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还可以。

safe=true 不是索引规范。

在MongoDB之前的版本中,低于3.4,可以添加额外的索引规范。那些被特定的驱动程序使用。

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

Ensuring that the specified index options are valid. Previous versions ignored invalid options.

这就是您出现此错误的原因。 恐怕你需要确保你的 3.2 版本中的索引没有无效的索引规范,然后再做 mongodump。

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

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

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

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

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

find . -type f -name "*.metadata.json" -exec sed -i 's/,"safe":null//g' {} \;

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

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

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

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