Mongo 唯一复合文本索引

Mongo unique compound text index

我正在尝试创建一个包含 2 个文本字段的 Mongo 索引,其中任何一个字段都可以在另一个文档中具有值,但同一对不能。我熟悉this concept in 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 都不与第一条记录重叠。

A 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
}

这将创建一个复合键。