Нечувствительный к регистру запрос на mongodb

Есть ли способ запросить значение без учета регистра на mongo без использования map/reduce?

Ответ 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);