Mongo 唯一复合文本索引
Mongo unique compound text index
我正在尝试创建一个包含 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
都不与第一条记录重叠。
A text index
实际上有点像 multikey index
,它试图将文本切割成位,然后可以使用特定的文本搜索运算符进行查询。此外,text
索引中字段的顺序并不重要(与普通复合索引相比),MongoDB 将遍历 symbol
和 date
并分别索引它们。
在这种情况下,我相信 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
}
这将创建一个复合键。
我正在尝试创建一个包含 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
都不与第一条记录重叠。
A text index
实际上有点像 multikey index
,它试图将文本切割成位,然后可以使用特定的文本搜索运算符进行查询。此外,text
索引中字段的顺序并不重要(与普通复合索引相比),MongoDB 将遍历 symbol
和 date
并分别索引它们。
在这种情况下,我相信 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
}
这将创建一个复合键。