@CompoundIndexes({
@CompoundIndex(name = "fertilizer_idx",
unique = true,
def = "{'name': 1, 'formula': 1, 'type': 1}")
})
public class Fertilizer extends Element implements Serializable {
//class stuff
}
Is it possible to create the index case insensitive? Right now it is differentiating from NAME
to NAMe
. Saving a second field lowercase (or uppercase) is not a possibility for me.
Thanks, Pedro
Prior of MongoDB version 3.4 we were unable to create index with case insensitive.
In version 3.4 has collation
option that allows users to specify language-specific rules for string comparison, such as rules for lettercase and accent marks.
The collation option has the following syntax:
collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
where the locale field is mandatory; all other fields are optional.
To create index with case insensitive we need to use mandatory field locale and strength field for string comparison level. strength
allows value rage 1 - 5. read more about collation
The strength attribute determines whether accents or case are taken into account when collating or matching text
Example:
if strength=1 then role = Role = rôle
if strength=2 then role = Role < rôle
if strength=3 then role < Role < rôle
So we need to use strength=2
to create index. like:
db.collectionName.createIndex(
{ name: 1, formula: 1, type: 1 },
{
name: "fertilizer_idx",
collation: {locale: "en", strength: 2},
unique: true
}
)
N.B: collation
option is not available for text indexes.