我有一个简单的“用户”集合,目前只有两个文档。
{
"_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,
现在,如果我尝试在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
}
}
和
{
"_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
}
}
上述显示中,我省略了一些字段,例如"display_name"、"registered_since"等(我认为它们在引发错误时没有任何作用,如果您仍需要它们,我可能可以将整个文档粘贴在这里)。
我正在使用Erlang MongoDB驱动程序与我的Mongo实例进行通信。正如您所见,所有字段都保存为二进制字节,这就是为什么您在文档中看到了这样奇怪的email_id。
注意:二进制字节格式并非由我的代码逻辑强制执行,我确实将字符串email_id传递到我的bson文档中,但我始终以二进制字节形式查看数据。(可能是因为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" : [ ]
}
email_id
的值实际上是按照整数键索引的子文档数组吗?还是它们是数组,并且这只是你的编程语言中它们的表示形式?另外,你使用的是哪种编程语言? - dcrostadb.users.findOne()
的输出?我仍然不确定Mongo是将它们视为数组还是子文档。 - dcrosta