MongoDB _id字段重复键错误

17

我有一个集合,其中 _id 字段是一个类型为 String 的 IP。

我使用 mongoose,但是控制台上出现了以下错误:

$ db.servers.remove()

$ db.servers.insert({"_id":"1.2.3.4"})

$ db.servers.insert({"_id":"1.2.3.5"}) <-- 报错 dup key: { : null }


你使用的是哪个版本? - WiredPrairie
它返回“dup key: { : null }”而不是您尝试插入的键的值,这也很奇怪。 - WiredPrairie
3
这是完整的错误消息吗?你在服务器集合中是否有一个需要每个文档具有唯一值的索引...?如果你插入两个“null”,第二个“null”值就会出现这种情况。 - WiredPrairie
2个回答

35

很可能是因为您的索引需要一个字段的唯一值,如下所示:

> db.servers.remove()
> db.servers.ensureIndex({"name": 1}, { unique: 1})
> db.servers.insert({"_id": "1.2.3"})
> db.servers.insert({"_id": "1.2.4"})
E11000 duplicate key error index: test.servers.$name_1  dup key: { : null }
您可以使用集合上的getIndexes()方法查看您的索引:
> db.servers.getIndexes()
[
    {
        "v" : 1,
        "key" : {
                "_id" : 1
        },
        "ns" : "test.servers",
        "name" : "_id_"
    },
    {
        "v" : 1,
        "key" : {
                "name" : 1
        },
        "unique" : true,
        "ns" : "test.servers",
        "name" : "name_1"
    }
]

就是这样,谢谢。我可能已经在我的mongoose模式中删除了该字段,但是忽略了删除集合。 - EthernetCable
起初,我对这个错误感到困惑,直到意识到它在抱怨“null”。 :) - WiredPrairie
@WiredPRairie 很好的发现!! :) - Tilo
我刚刚也做了同样的事情!谢谢 - Tony Day

7
今天我也遇到了同样的错误,后来搞明白了。因为我从mongoose模式中删除了一个索引属性,但是没有从mongodb索引中删除该属性。实际上,这个错误信息是由于新文档具有一个索引属性,其值为null(不在json中)。

1
意思是:登录Mongo数据库,进入适当的集合并从那里删除索引。 - Dani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接