регистронезависимый запрос на mongodb - PullRequest
17 голосов
/ 31 марта 2011

есть ли способ запросить нечувствительное к регистру значение на монго без использования map / lower?

Ответы [ 4 ]

25 голосов
/ 31 марта 2011

Предположим, у вас есть документ, содержащий поле tag, и вы хотите выполнить поиск по нему

Tags
{
  tag,
  ...
 }

Первый вариант - использовать регулярное выражение (но он работает медленно, как сказал @RestRisiko):

db.tags.find( { "tag" : { "$regex" : "C#", "$options" : "-i" } })

Второй вариант - создать другое поле в нижнем регистре (и в mongodb это лучше всего):

Tags
{
  tag,
  tagLower,
  ..
}

И используйте find как обычно:

db.tags.find( { "tagLower" : "c#"})

Это будет работать быстрее, потому что приведенный выше код может использовать индекс для поиска.

8 голосов
/ 31 марта 2011

Вы должны нормализовать данные для запроса.Использование регулярного выражения для поиска без учета регистра может работать, а также не будет использовать индексы.Так что ваш единственный вариант - нормализоваться.Если вам нужно сохранить исходное состояние, вам необходимо денормализовать данные и сохранить нормализованные значения в отдельном столбце документа.

2 голосов
/ 29 сентября 2011

При использовании его с Node.js лучше всего построить объект RegEx в запросе.

Room.findOne({'name': new RegExp(roomName, 'i')}, {}, function(err, room) {
...
0 голосов
/ 11 декабря 2015

Используйте совпадения регулярных выражений, как показано ниже.«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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...