Проверка, содержит ли поле строку

Я ищу оператора, который позволяет проверить, если значение поля содержит определенную строку.

Что-то вроде:

db.users.findOne({$contains:{"username":"son"}})

Это возможно?

Ответ 1

Вы можете сделать это со следующим кодом.

db.users.findOne({"username" : {$regex : ".*son.*"}});

Ответ 2

Как поддержка регулярного выражения оболочки Mongo, это вполне возможно.

db.users.findOne({"username" : /.*son.*/});

Если мы хотим, чтобы запрос был нечувствительным к регистру, мы можем использовать опцию "i", как показано ниже:

db.users.findOne({"username" : /.*son.*/i});

Смотрите: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions

Ответ 4

Начиная с версии 2.4 вы можете создать текстовый индекс в поле для поиска и использования $текстовый для запросов.

Сначала создайте индекс:

db.users.createIndex( { "username": "text" } )

Затем для поиска:

db.users.find( { $text: { $search: "son" } } )

Контрольные показатели (документы ~ 150K):

  • Regex (другие ответы) = > 5.6-6.9 секунд
  • Поиск текста = > .164-.201 секунд

Примечания:

  • Коллекция может иметь только один текстовый индекс. Вы можете использовать индекс подстановочного текста, если хотите найти любое строковое поле, например: db.collection.createIndex( { "$**": "text" } ).
  • Текстовый индекс может быть большим. Он содержит одну запись индекса для каждого уникального слова post-stemmed в каждом индексированном поле для каждого вставленного документа.
  • Текстовый индекс займет больше времени, чем обычный индекс.
  • Текстовый индекс не хранит фразы или информацию о близости слов в документах. В результате фразовые запросы будут выполняться намного эффективнее, если вся коллекция будет в ОЗУ.

Ответ 5

Поскольку это одно из первых хитов в поисковых системах, и ни одно из вышеизложенных, похоже, не работает для MongoDB 3.x, вот один регулярный поиск, который работает:

db.users.find( { 'name' : { '$regex' : yourvalue, '$options' : 'i' } } )

Не нужно создавать и добавлять индекс или аналогично.

Ответ 6

Вот что вам нужно сделать, если вы подключаете MongoDB через Python

db.users.find({"username": {'$regex' : '.*' + 'Son' + '.*'}})

вы также можете использовать имя переменной вместо "Сын" и, следовательно, конкатенацию строк.

Ответ 7

Самый простой способ выполнить эту задачу.

Если вы хотите, чтобы запрос был чувствительным к регистру

db.getCollection("users").find({'username':/Son/})

Если вы хотите, чтобы запрос был без учета регистра

db.getCollection("users").find({'username':/Son/i})

Ответ 8

Как игнорировать теги HTML в совпадении с RegExp:

var text = '<p>The <b>tiger</b> (<i>Panthera tigris</i>) is the largest <a href="/wiki/Felidae" title="Felidae">cat</a> <a href="/wiki/Species" title="Species">species</a>, most recognizable for its pattern of dark vertical stripes on reddish-orange fur with a lighter underside. The species is classified in the genus <i><a href="/wiki/Panthera" title="Panthera">Panthera</a></i> with the <a href="/wiki/Lion" title="Lion">lion</a>, <a href="/wiki/Leopard" title="Leopard">leopard</a>, <a href="/wiki/Jaguar" title="Jaguar">jaguar</a>, and <a href="/wiki/Snow_leopard" title="Snow leopard">snow leopard</a>. It is an <a href="/wiki/Apex_predator" title="Apex predator">apex predator</a>, primarily preying on <a href="/wiki/Ungulate" title="Ungulate">ungulates</a> such as <a href="/wiki/Deer" title="Deer">deer</a> and <a href="/wiki/Bovid" class="mw-redirect" title="Bovid">bovids</a>.</p>';
var searchString = 'largest cat species';

var rx = '';
searchString.split(' ').forEach(e => {
  rx += '('+e+')((?:\\s*(?:<\/?\\w[^<>]*>)?\\s*)*)';
});

rx = new RegExp(rx, 'igm');

console.log(text.match(rx));

Это, вероятно, очень легко превратить в агрегирующий фильтр MongoDB.

Ответ 9

идеальный ответ его индекс использования я вариант для без учета регистра

db.users.findOne({"username" : new RegExp(search_value, 'i') });