Есть ли способ запросить значение без учета регистра на mongo без использования map/reduce?
Нечувствительный к регистру запрос на mongodb
Ответ 1
Предположим, что у вас есть документ, содержащий поле tag
, и вы хотите его найти.
Tags
{
tag,
...
}
Первый вариант - использовать регулярное выражение (но он работает медленно, как сказал @RestRisiko):
db.tags.find( { "tag" : { "$regex" : "C#", "$options" : "-i" } })
Второй вариант - создать другое поле в нижнем регистре (и в mongodb это лучший способ):
Tags
{
tag,
tagLower,
..
}
И используйте find
, как обычно:
db.tags.find( { "tagLower" : "c#"})
Он будет работать быстрее, потому что выше код может использовать индекс для поиска.
Ответ 2
Вы должны нормализовать данные для запроса. Использование регулярного выражения для нечувствительного к регистру поиска может работать, но оно не будет использовать индексы. Поэтому ваш единственный вариант - нормализовать. Если вам нужно сохранить исходное состояние, вам необходимо денормализовать данные и сохранить нормализованные значения в выделенном столбце документа.
Ответ 3
При использовании с Node.js лучше всего создать объект RegEx в запросе.
Room.findOne({'name': new RegExp(roomName, 'i')}, {}, function(err, room) {
...
Ответ 4
Используйте регулярные выражения, как показано ниже. "I" показывает нечувствительность к регистру.
var collections = mongoDatabase.GetCollection("Abcd");
var queryA = Query.And(
Query.Matches("strName", new BsonRegularExpression("MSID", "i")),
Query.Matches("strVal", new BsonRegularExpression("154800", "i")));
var queryB = Query.And(
Query.Matches("strName", new BsonRegularExpression("Operation","i")),
Query.Matches("strVal", new BsonRegularExpression("8221", "i")));
var getA = collections.Find(queryA);
var getB = collections.Find(queryB);