我有一个简单的"用户"集合,其中我现在只有2个文档.
{
"_id": ObjectId("4ef8e1e41d41c87069000074"),
"email_id": {
"0": 109,
"1": 101,
"2": 64,
"3": 97,
{
"_id": ObjectId("4ef6d2641d41c83bdd000001"),
"email_id": {
"0": 109,
"1": 97,
"2": 105,
"3": 108,
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试在email_id字段上使用{unique:true}创建一个新索引,mongodb会向我抱怨"E11000重复键错误索引:db.users.$ email_id dup key:{:46}".即使在指定{dropDups:true}之后我也会得到相同的错误,但我不认为这是这种情况,因为两个文档都存储了不同的电子邮件ID.
我不确定这里发生了什么,任何指针都会非常感激.
编辑:文档的完整视图:
{
"_id": ObjectId("4ef8e1e41d41c87069000074"),
"email_id": {
"0": 109,
"1": 101,
"2": 64,
"3": 97,
"4": 98,
"5": 104,
"6": 105,
"7": 110,
"8": 97,
"9": 118,
"10": 115,
"11": 105,
"12": 110,
"13": 103,
"14": 104,
"15": 46,
"16": 99,
"17": 111,
"18": 109
}
}
Run Code Online (Sandbox Code Playgroud)
和
{
"_id": ObjectId("4ef6d2641d41c83bdd000001"),
"email_id": {
"0": 109,
"1": 97,
"2": 105,
"3": 108,
"4": 115,
"5": 102,
"6": 111,
"7": 114,
"8": 97,
"9": 98,
"10": 104,
"11": 105,
"12": 110,
"13": 97,
"14": 118,
"15": 64,
"16": 103,
"17": 109,
"18": 97,
"19": 105,
"20": 108,
"21": 46,
"22": 99,
"23": 111,
"24": 109
}
}
Run Code Online (Sandbox Code Playgroud)
还有一些更多的字段,比如"display_name","registered_since"等我从上面的显示中省略了(我不认为他们在抛出的错误中有任何作用,如果你仍然需要它们我可以粘贴整个文件在这里)
我正在使用erlang mongodb驱动程序与我的mongo实例进行通信.可以看到的所有字段都保存为二进制字节,这就是为什么你在文档中看到如此奇怪的email_id.
注意:二进制字节格式不是由我的代码逻辑强制的,我非常在我的bson文档中传递字符串email_id,但我总是最终看到我的数据为二进制字节.(可能是因为如何编写erlang mongodb驱动程序,我没有真正对此进行调查,因为我的find(),find_one()和其他查询按预期工作,即使字段保存为二进制字节)
编辑:> db.users.findOne()
{
"_id" : ObjectId("4ef6d2641d41c83bdd000001"),
"email_id" : [
109,
97,
105,
108,
115,
102,
111,
114,
97,
98,
104,
105,
110,
97,
118,
64,
103,
109,
97,
105,
108,
46,
99,
111,
109
],
"display_name" : [
65,
98,
104,
105,
110,
97,
118,
43,
83,
105,
110,
103,
104
],
"provider" : [
106,
97,
120,
108,
46,
105,
109
],
"provider_id" : [ ]
}
Run Code Online (Sandbox Code Playgroud)
当MongoDB索引数组字段时,它实际上索引数组中的各个元素.这是为了有效地支持查找数组的特定元素的查询,例如:
db.users.find({email_id: 46})
Run Code Online (Sandbox Code Playgroud)
由于这email_id(46)存在于两个文档中,因此唯一索引中存在重复的键.
如果你已经dropDups: true设置了,我不确定你为什么会得到这个错误...你能用你如何调用代码示例createIndex吗?你也应该尝试dropDups: 1,因为MongoDB 在这种情况下错误地对待1和true不同(参见https://jira.mongodb.org/browse/SERVER-4562).
| 归档时间: |
|
| 查看次数: |
12806 次 |
| 最近记录: |