蒙戈唯一的复合文本索引



我正在尝试创建一个包含 2 个文本字段的 Mongo 索引,其中任何一个字段都可以在另一个文档中具有值,但同一对不能。我在MySQL中熟悉这个概念,但在Mongo中不理解它。

我想在这些文档的symboldate字段上创建一个唯一的索引:

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 }"
}
})

我不明白这里的错误消息...在这种情况下,symboldate都不会与第一条记录重叠。

text index实际上的行为有点像multikey index,它试图将文本切割成位,然后可以使用特定的文本搜索运算符进行查询。此外,text索引中字段的顺序并不重要(与普通复合索引相比(,MongoDB将只遍历symboldate中的所有值,并分别索引它们。

在这种情况下,我相信 mongo 试图分别索引2017中的01-01-中的01

我不认为在您的情况下,您真的想做文本索引,它是用于搜索长文本,而不是其中具有单个值的字段。

而且,text索引的多键性质使得很难保持唯一性。

我的建议是这样的:db.earnings_quotes.createIndex({symbol: 1, date: 1}, {unique: true})

默认情况下,mongo 使用_id作为唯一键和索引,因此解决问题的一种方法是将数据保存在_id字段中。

例如:

{
"_id":{
"symbol" :"xyz" ,
"date" :"12-12-20" ,
}
//Other fields in collection
}

这将创建一个组合键。

最新更新