由于索引,mongoimport E11000 重复键

mongoimport E11000 duplicate key due to index

我有一个包含以下字段的集合:

name
type
color

我也有唯一索引name_1_type_1

假设一个数据集:

[{
  name: "name1",
  type: "type1",
  color: "blue"
}, {
  name: "name2",
  type: "type1",
  color: "green"
}]

我使用 mongoimport 创建初始数据集。

现在,我需要更新集合以实现以下 3 个目标:

  1. 插入新文档(例如下面代码段中的 name1-type2
  2. 更新现有文档中的 color(例如下面 name1 中的 blue->red
  3. 在某些文档中附加一个新的可选字段shape

    [
        {
            name: "name1",
            type: "type1",
            color: "red",
            shape: "circle"
        }, 
        {
            name: "name1",
            type: "type2",
            color: "green",
            shape: "rectangle"
        }
    ]
    

然而,当对上述 json 文件执行 mongoimport --upsert 时,我得到:

error inserting documents: E11000 duplicate key error collection: test.col1 index: name_1_type_1 dup key

可能我用错了mongoimport

如何使用 mongoimport 实现上述 3 个 upsert 目标?

您似乎错过了 --upsertFields 选项。如果没有它,mongoimport 假设您的意思是 _id,特别是如果正在导入的文件中不存在它,那么它只是一直尝试 "insert" 新项目。因此重复键错误。

因此,如果您指定基于唯一键的字段:

mongoimport -d database -c collection --upsert --upsertFields name,type input.json

那么你应该得到如下结果:

{
        "_id" : ObjectId("56f6332a49ec4ea8330063b6"),
        "name" : "name1",
        "type" : "type1",
        "color" : "red",
        "shape" : "circle"
}
{
        "_id" : ObjectId("56f6332a49ec4ea8330063b7"),
        "name" : "name2",
        "type" : "type1",
        "color" : "green"
}
{
        "_id" : ObjectId("56f633d4824b97f80d3714b1"),
        "name" : "name1",
        "type" : "type2",
        "color" : "green",
        "shape" : "rectangle"
}

请注意,在现代版本中,当您使用 --upsertFields 时隐含了 --upsert

N.B. 如果您的数据结构如此,您可能还需要 --jsonArray