Как запросить MongoDB с «лайк»? - PullRequest
1258 голосов
/ 22 июля 2010

Я хочу запросить что-то с запросом SQL like:

SELECT * FROM users  WHERE name LIKE '%m%'

Как мне добиться того же в MongoDB? Я не могу найти оператора для like в документации .

Ответы [ 33 ]

1711 голосов
/ 22 июля 2010

Это должно быть:

db.users.find({"name": /.*m.*/})

или аналогичный:

db.users.find({"name": /m/})

Вы ищете что-то, что где-то содержит «m» (оператор «%» SQL эквивалентен «.*» в Regexp), а не то, что «m» привязано к началу строки.

308 голосов
/ 20 мая 2014
db.users.insert({name: 'paulo'})
db.users.insert({name: 'patric'})
db.users.insert({name: 'pedro'})

db.users.find({name: /a/})  //like '%a%'

выход: Пауло, Патрик

db.users.find({name: /^pa/}) //like 'pa%' 

Выход: Пауло, Патрик

db.users.find({name: /ro$/}) //like '%ro'

Выход: Педро

237 голосов
/ 07 октября 2012

В

  • PyMongo с использованием Python
  • Мангуст с использованием Node.js
  • Jongo , с использованием Java
  • mgo , используя Go

вы можете сделать:

db.users.find({'name': {'$regex': 'sometext'}})
80 голосов
/ 13 мая 2011

В PHP вы можете использовать следующий код:

$collection->find(array('name'=> array('$regex' => 'm'));
46 голосов
/ 22 июля 2010

Для этого вы можете использовать регулярные выражения в монго.

Например: db.users.find({"name": /^m/})

39 голосов
/ 11 августа 2016

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

Вы можете делать с регулярными выражениями, которые содержат слово, например, как.Также вы можете использовать $options => i для поиска без учета регистра

Содержит string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})

Не содержит string только с регулярным выражением

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})

Точныйрегистр не учитывается string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})

Начать с string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})

Окончить с string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})

Сохранить это в качестве закладки и ссылки на любые другие изменения, которые могут вам понадобиться.

28 голосов
/ 09 марта 2014

Если используется node.js , , то говорит, что вы можете написать это:

db.collection.find( { field: /acme.*corp/i } );
//or
db.collection.find( { field: { $regex: 'acme.*corp', $options: 'i' } } );

Также , вы можете написать это:

db.collection.find( { field: new RegExp('acme.*corp', 'i') } );
26 голосов
/ 26 апреля 2017

У вас есть 2 варианта:

db.users.find({"name": /string/})

или

db.users.find({"name": {"$regex": "string", "$options": "i"}})

На втором у вас есть больше опций, например, «i» в опциях, чтобы найти использование без учета регистра. А что касается «строки», вы можете использовать, например, «. string. » (% string%) или «string. *» (String%) и «. * String) (% string) . Вы можете использовать регулярные выражения как хотите.

Наслаждайтесь!

17 голосов
/ 21 ноября 2014

Уже вы получили ответы, но чтобы сопоставить регулярное выражение с нечувствительностью к регистру

Вы можете использовать следующий запрос

db.users.find ({ "name" : /m/i } ).pretty()

i в /m/i указывает на нечувствительность к регистру и .pretty() обеспечивает более симпатичный вывод

13 голосов
/ 10 ноября 2015

Для мангуста в Node.js

db.users.find({'name': {'$regex': '.*sometext.*'}})
...