Я ищу оператора, который позволяет проверить, если значение поля содержит определенную строку.Проверка, содержит ли поле строку
Что-то вроде:
db.users.findOne({$contains:{"username":"son"}})
Возможно ли это?
Я ищу оператора, который позволяет проверить, если значение поля содержит определенную строку.Проверка, содержит ли поле строку
Что-то вроде:
db.users.findOne({$contains:{"username":"son"}})
Возможно ли это?
Вы можете сделать это с помощью следующего кода.
db.users.findOne({"username" : {$regex : ".*son.*"}});
As Mongo оболочка поддержка regex, это вполне возможно.
db.users.findOne({"username" : /.*son.*/});
Если мы хотим, чтобы запрос быть нечувствительны к регистру, мы можем использовать "я" вариант, как показано ниже:
db.users.findOne({"username" : /.*son.*/i});
См: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions
Пожалуйста, включите фрагмент кода, демонстрирующий использование регулярных выражений для поиска. Ответы должны содержать больше информации, чем просто ссылку ... – maerics
О, спасибо! Образец кода просто добавлен. –
Выбранный ответ не сработал для меня, но это было сделано (я выполняю запросы mongo с помощью команд docker exec). Я думаю, что это должен быть выбранный ответ, потому что он выглядит более универсальным. –
http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart
http://php.net/manual/en/mongo.sqltomongo.php
MySQL
SELECT * FROM users WHERE username LIKE "%Son%"
MongoDB
db.users.find({username:/Son/})
Ваш ответ MongoDB хорош; рассмотрите возможность редактирования вопроса, чтобы удалить ненужный совет MySQL. – maerics
Удалить все запрос или изменить его? большинство poeple известных SQL, полезно для понимания MongoDB –
@ZhengKai: на этом сайте вы должны, как правило, отвечать на вопрос напрямую, используя только те технологии, которые были отмечены тегами и запрошены. – maerics
Вот что вы должны сделать, если вы подключаетесь MongoDB через Python
db.users.find({"username": {'$regex' : '.*' + 'Son' + '.*'}})
вы можете также использовать имя переменной вместо и, следовательно, конкатенации «Son».
в es2015 вы можете использовать обратные ссылки {$ regex: '. * $ {Value}. *'} –
Начиная с версии 2.4, вы можете создать text index на поле (ы) для поиска и использования оператора $text для запроса.
Во-первых, создать индекс:
db.users.createIndex({ "username": "text" })
Затем сделать поиск:
db.users.find({ $text: { $search: "son" } })
контрольные показатели (~ 150K документы):
Примечания:
db.collection.createIndex({ "$**": "text" })
.no, оперативный текстовый оператор не разрешает выполнять «содержит», поэтому он возвращает только точное совпадение слов, единственный вариант в настоящее время, начиная с версии 3.0, используется regex, т. е. db.users.find ({имя_пользователя:/son/i)), этот поиск каждого пользователя, содержащего «сын» (case-insenstive) – comeGetSome
Вам нужно переиндексировать при добавлении или удалении документы в/из коллекции? –
Поскольку это один из первых хитов в поисковых системах, и ни один из вышеперечисленных, кажется, работают для MongoDB 3.x, вот один поиск регулярного выражения, которое делает работу:
db.users.find({ 'name' : { '$regex' : yourvalue, '$options' : 'i' } })
Нет необходимо создать и дополнительный индекс или аналогичный.
Простейший способ выполнить эту задачу
Если вы хотите запрос быть чувствителен к регистру
db.getCollection("users").find({'username':/Son/})
Если вы хотите запрос быть регистронезависимым
db.getCollection("users").find({'username':/Son/i})
Обратите внимание, что это ** не ** эффективно использует индекс и приводит к сканированию всех значений для совпадений. См. Примечания к [Регулярные выражения] (http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions) – Stennie
@Stennie, то что вы предлагаете эффективно использовать индекс и найти подстроку , –
@Vish: если ваш обычный вариант использования - это поиск в свободном тексте поля, и у вас есть большое количество документов, я бы подделал текст для более эффективных запросов. Вы можете использовать [multikeys] (http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo) для простого полнотекстового поиска или, возможно, создать [инвертированный индекс] (http: //en.wikipedia.org/wiki/Inverted_index) в виде отдельной коллекции. Для редких поисков или небольшого набора документов сканирование полного индекса может быть приемлемым (хотя и не оптимальным). – Stennie