如何在 MongoDB 中创建不区分大小写的唯一复合索引?

问题描述 投票:0回答:1

如何在 MongoDB 中创建不区分大小写的唯一复合索引?

问题正文: 我正在尝试使用以下字段在 MongoDB 中创建一个复合唯一文本索引:

租户 ID:1 卖家 ID:1 seller_sku_code:文本 但是,我在尝试创建索引时遇到错误: 索引构建失败:4df81a22-042f-4e51-bbec-b0f8a7dafe2e:集合product_db.skus(83cc8978-b0fe-4c4b-ae58-691e32db7f95):::E11000重复键错误集合:product_db.skus索引:tenant_id_1_seller_id_1_seller_sku_ code_text 重复密钥: {tenant_id:“1”,seller_id:“113”,_fts:“acc”,_ftsx:0.75}

我需要确保 seller_sku_code 在数据库中是唯一的并且不区分大小写。例如:

不允许同时使用“ABC”和“abc”。 应允许“ACC-2001”和“ACC-2000”共存。

如何在 seller_sku_code 上创建这个唯一的、不区分大小写的索引,同时仍确保tenant_id 和 seller_id 字段的唯一性?

mongodb indexing unique-constraint case-insensitive compound-index
1个回答
0
投票

相同的索引即可完成这项工作。成功执行索引创建语句后,所有新文档将根据您想要的新规则进行存储。为了证明同一点,请查看带有一些示例文档的操作日志。

use test
test> t = db.test
test> t.drop()

// creating a unique case-insensitive compound text index
test> t.createIndex({a:1,b:1,c:'text'}, {unique:true});

// inserting a document
t.insertOne({a:'1',b:'2',c:'ABC'});

// inserting another document
// please note the difference in this document,
// the value for the key c is ‘abc’ which differs in case.
test> t.insertOne({a:'1',b:'2',c:'abc'});
MongoServerError: E11000 duplicate key error collection: test.test index: a_1_b_1_c_text dup key: { a: "1", b: "2", _fts: "a

请注意,由于密钥违规,第二个文档未创建。这意味着不会存储违反您正在查找的规则的新文档。这种行为的原因可以从 MongoDB 手册中的下面的引用中理解。有关更多信息,请参阅下面的链接 1。

文本索引不区分大小写。文本索引不区分大小写字符,例如 e 和 E。

现在您面临的问题是,在没有该索引的情况下,集合中已经存储了重复的信息。将如何解决?所需的操作是从集合中删除此类文档并启用相同的索引。如您所知,如果它是一个高效的数据库,则需要仔细分析、行动规划和执行。

注意: 作为最后的澄清,以下两个语句将成功,因为索引前缀键的值 - a 和 b 是新的。

t.insertOne({a:'2',b:'2',c:'abc'});
t.insertOne({a:'2',b:'3',c:'abc'});

链接:

1) 文本索引属性

© www.soinside.com 2019 - 2024. All rights reserved.