【问题标题】:mongoimport E11000 duplicate key due to index由于索引,mongoimport E11000 重复键
【发布时间】:2016-03-26 06:52:44
【问题描述】:

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

name
type
color

我还有一个唯一索引name_1_type_1。

假设一个数据集:

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

使用mongoimport 创建初始数据集。

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

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

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

但是,在上述 json 文件上执行 mongoimport --upsert 时,我得到:

插入文档时出错:E11000 重复键错误收集: test.col1 索引:name_1_type_1 复制键

也许我以错误的方式使用mongoimport。

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

【问题讨论】:

    标签: mongodb mongoimport


    【解决方案1】:

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

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

    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"
    }
    

    请注意,在现代版本中,--upsert 在您使用 --upsertFields 时是隐含的。

    注意如果您的数据采用这种结构,您可能还需要--jsonArray。

    【讨论】:

      猜你喜欢
      • 2014-01-06
      • 2017-01-03
      • 2017-05-25
      • 1970-01-01
      • 2017-03-02
      • 2019-07-11
      • 2016-10-31
      • 2021-10-25
      相关资源
      最近更新 更多