@CompoundIndexes({
@CompoundIndex(name = "fertilizer_idx",
unique = true,
def = "{'name': 1, 'formula': 1, 'type': 1}")
})
public class Fertilizer extends Element implements Serializable {
//class stuff
}
是否可以创建不区分大小写的索引?现在它区别于NAME
到NAMe
。我不可能保存第二个字段小写(或大写)。
谢谢, 佩德罗
答案 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;作用强>
因此我们需要使用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 } }
)
使用collation作为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
}
启动应用程序后,它将为每个文档创建索引以及相应的排序规则。
答案 4 :(得分:0)
如上文 Shaishab Roy 所述,您应该使用collation.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)));
}
}