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

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

что-то типа:

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

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

8 ответов


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

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

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

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

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

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

см.: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions


http://www.mongodb.org/display/DOCS/SQL+к+Mongo + отображение + диаграмма

http://php.net/manual/en/mongo.sqltomongo.php

в MySQL

SELECT * FROM users WHERE username LIKE "%Son%"

MongoDB

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

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

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

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

тогда, для поиска:

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

бенчмарки (~150K документов):

  • регулярное выражение (и другие ответы) => 5.6-6.9 секунд
  • Поиск По Тексту => .164-.Двести один секунды!--21-->

Примечания:

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

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

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

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


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

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

нет необходимости создавать и дополнительный индекс или так.


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

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

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

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

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

Как игнорировать HTML-теги в матче регулярного выражения:

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.