Mongo唯一索引不区分大小写

时间:2015-11-16 13:08:35

标签: mongodb spring-data-mongodb mongodb-indexes

@CompoundIndexes({
    @CompoundIndex(name = "fertilizer_idx",
        unique = true,
        def = "{'name': 1, 'formula': 1, 'type': 1}")
})
public class Fertilizer extends Element implements Serializable {
//class stuff
}

是否可以创建不区分大小写的索引?现在它区别于NAMENAMe。我不可能保存第二个字段小写(或大写)。

谢谢, 佩德罗

5 个答案:

答案 0 :(得分:9)

MongoDB版本3.4 之前,我们无法使用不区分大小写的创建索引

在版本3.4中有collation选项,允许用户为字符串比较指定特定于语言的规则,例如字母和重音符号规则。< / p>

排序规则选项具有以下语法:

collation: {
   locale: <string>,
   caseLevel: <boolean>,
   caseFirst: <string>,
   strength: <int>,
   numericOrdering: <boolean>,
   alternate: <string>,
   maxVariable: <string>,
   backwards: <boolean>
}

区域设置字段必需;所有其他字段都是可选

要创建不区分大小写的索引,我们需要使用必填字段区域设置强度字段作为字符串比较级别。 strength允许值愤怒 1 - 5 read more about collation

strength属性确定在整理或匹配文本时是否考虑重音或大小写

示例:

  

如果 strong = 1 role = Role =rôle

     

如果 strong = 2 role = Role&lt; rôle

     

如果强度= 3 角色&lt;角色&lt;作用

Comparison level doc

因此我们需要使用strength=2来创建索引。像:

db.collectionName.createIndex(
  { name: 1, formula: 1, type: 1 },
  { 
    name: "fertilizer_idx",
    collation: {locale: "en", strength: 2},
    unique: true
  }
)

N.B collation选项不适用于 text 索引。

答案 1 :(得分:5)

是的,它现在可以在MongoDB 3.4中使用新的排序规则功能。

您可以创建一个不区分大小写的索引,如下所示:

db.collection.createIndex({
   name:1,
   formula:1,
   type:1
},
{
   collation:{
      locale:"en",
      strength:2
   }
});

其中strength属性是比较级别

然后,您可以对此查询进行不区分大小写的匹配:

db.collection.find({name: "name"}).collation({locale: "en", strength: 2});

有关详细信息,请参阅collation

如果从先前版本升级到mongodb 3.4,则可能需要在创建索引之前设置兼容性

db.adminCommand( { setFeatureCompatibilityVersion: "3.4" } )

答案 2 :(得分:1)

db.collection.createIndex(
{ name: 1, formula: 1, type: 1 },
{ name: "fertilizer_idx", unique: true, collation:{ locale: "en", strength: 2 } }
)

使用collat​​ion作为db.collection.createIndex()

的选项

更多信息:     https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/

这里是语言环境/语言信息: https://docs.mongodb.com/manual/reference/collation-locales-defaults/#collation-languages-locales

强度:整数

可选。要执行的比较级别。可能的值有:

1:主要的比较水平。整理仅执行基本字符的比较,忽略其他差异,如变音符号和大小写。

2:二级比较。整理执行比较直到次要差异,例如变音符号。也就是说,校对执行基本字符(主要差异)和变音符号(次要差异)的比较。基本字符之间的差异优先于次要差异。

3:第三级比较。整理执行与三级差异的比较,例如大小写和字母变体。也就是说,校对执行基本字符(主要差异),变音符号(次要差异)以及案例和变体(第三级差异)的比较。基本字符之间的差异优先于次要差异,后者优先于次要差异。 这是默认级别。

4:第四级。限制特定用例在1-3级忽略标点符号或处理日文文本时考虑标点符号。

5:相同级别。限于特殊用途的领带破碎机。

Mongo 3.4具有排序规则,允许用户为字符串比较指定特定于语言的规则

整理包括:

collation: {
   locale: <string>,
   caseLevel: <boolean>,
   caseFirst: <string>,
   strength: <int>,
   numericOrdering: <boolean>,
   alternate: <string>,
   maxVariable: <string>,
   backwards: <boolean>
}

答案 3 :(得分:1)

Spring Data Mongo2.2提供了“通过@Document和@Query的基于注释的归类支持。”

参考What's new in Spring Data Mongo2.2

@Document(collection = 'fertilizer', collation = "{'locale':'en', 'strength':2}")
public class Fertilizer extends Element implements Serializable {

    @Indexed(unique = true)
    private String name;
    //class stuff
}

启动应用程序后,它将为每个文档创建索引以及相应的排序规则。

Collation changes at DB level based on Java code

答案 4 :(得分:0)

如上文 Shaishab Roy 所述,您应该使用collat​​ion.strength

无法用弹簧数据的注释来定义

但是您可以手动实施。要在spring应用程序中实现此行为,您应该创建事件侦听器以侦听您的应用程序已准备就绪,注入MongoOperations bean并定义索引,如下例所示:

@Configuration
public class MongoConfig {
  @Autowired
  private MongoOperations mongoOperations;

  @EventListener(ApplicationReadyEvent.class)
  public void initMongo() {
    mongoOperations
    .indexOps(YourCollectionClass.class)
    .ensureIndex(
        new Index()
            .on("indexing_field_name", Sort.Direction.ASC)
            .unique()
            .collation(Collation.of("en").strength(2)));
  }
}