我正在尝试创建一个具有2个文本字段的Mongo索引,其中一个字段在另一个文档中可以有一个值,但是同一对不能。我对this concept in MySQL很熟悉,但是在Mongo中却不了解。
我想在这些文档的symbol
和date
字段上创建唯一索引:
db.earnings_quotes.insert({"symbol":"UNF","date":"2017-01-04","quote":{"price": 5000}});
db.earnings_quotes.createIndex({symbol: 'text', date: 'text'}, {unique: true})
db.earnings_quotes.insert({symbol: 'HAL', date: '2018-01-22', quote: { "price": 10000 }});
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: sample.earnings_quotes.$symbol_text_date_text dup key: { : \"01\", : 0.6666666666666666 }"
}
})
我不明白这里的错误消息...在这种情况下,symbol
和date
都没有与第一条记录重叠。
答案 0 :(得分:1)
text index
实际上的行为有点像multikey index
,它试图将文本切成小段,然后可以使用特定的文本搜索运算符对其进行查询。另外,text
索引中字段的顺序并不重要(与普通的复合索引相比),MongoDB只会遍历symbol
和date
中的所有值并分别索引它们。
在这种情况下,我认为mongo尝试分别为01
中的2017
和01
中的-01-
编制索引。
在您的情况下,我不认为您真的想做一个文本索引,它是用于搜索长文本,而不是其中包含单个值的字段。
而且,text
索引的多键性质使其很难保持唯一性。
我的建议是这样:
db.earnings_quotes.createIndex({symbol: 1, date: 1}, {unique: true})
答案 1 :(得分:0)
默认情况下,mongo使用_id
作为唯一键和索引,因此解决此问题的一种方法是将数据保存在_id字段中。
例如:
{
"_id":{
"symbol" :"xyz" ,
"date" :"12-12-20" ,
}
//Other fields in collection
}
这将创建一个复合键。