Mongo独特的复合文字索引

时间:2019-08-16 12:57:10

标签: mongodb unique-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都没有与第一条记录重叠。

2 个答案:

答案 0 :(得分:1)

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

在这种情况下,我认为mongo尝试分别为01中的201701中的-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
}

这将创建一个复合键。