由于索引,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 个目标:
- 插入新文档(例如下面代码段中的
name1
-type2
)
- 更新现有文档中的
color
(例如下面 name1
中的 blue
->red
)
在某些文档中附加一个新的可选字段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
。
我有一个包含以下字段的集合:
name
type
color
我也有唯一索引name_1_type_1
。
假设一个数据集:
[{
name: "name1",
type: "type1",
color: "blue"
}, {
name: "name2",
type: "type1",
color: "green"
}]
我使用 mongoimport
创建初始数据集。
现在,我需要更新集合以实现以下 3 个目标:
- 插入新文档(例如下面代码段中的
name1
-type2
) - 更新现有文档中的
color
(例如下面name1
中的blue
->red
) 在某些文档中附加一个新的可选字段
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
。