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

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

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

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

Ответы [ 33 ]

4 голосов
/ 28 апреля 2015

Если вы используете Spring-Data Mongodb, вы можете сделать это следующим образом:

String tagName = "m";
Query query = new Query();
query.limit(10);        
query.addCriteria(Criteria.where("tagName").regex(tagName));
4 голосов
/ 10 января 2017

Похоже, что есть причины использовать как шаблон javascript /regex_pattern/, так и шаблон mongo {'$regex': 'regex_pattern'}. См .: Ограничения синтаксиса MongoBD RegEx

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

> ['abbbb','bbabb','bbbba'].forEach(function(v){db.test_collection.insert({val: v})})

> db.test_collection.find({val: /a/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }

> db.test_collection.find({val: /.*a.*/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }

> db.test_collection.find({val: /.+a.+/})
{ "val" : "bbabb" }

> db.test_collection.find({val: /^a/})
{ "val" : "abbbb" }

> db.test_collection.find({val: /a$/})
{ "val" : "bbbba" }

> db.test_collection.find({val: {'$regex': 'a$'}})
{ "val" : "bbbba" }
4 голосов
/ 23 августа 2016

Если вы хотите выполнить поиск «Мне нравится» в монго, то вам нужно использовать $ regex, используя этот запрос:

db.product.find({name:{$regex:/m/i}})

. Более подробную информацию вы также можете прочитать в документации.https://docs.mongodb.com/manual/reference/operator/query/regex/

4 голосов
/ 19 января 2016

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

db.users.findOne({"name" : /.*sometext.*/});

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

db.users.findOne({"name" : /.*sometext.*/i});
3 голосов
/ 08 июня 2018

Использование шаблонных литералов с переменными также работает:

{"firstname": {$regex : `^${req.body.firstname}.*` , $options: 'si' }}

3 голосов
/ 03 января 2018

Использовать поиск по подстроке агрегирования (с индексом !!!):

db.collection.aggregate([{
        $project : {
            fieldExists : {
                $indexOfBytes : ['$field', 'string']
            }
        }
    }, {
        $match : {
            fieldExists : {
                $gt : -1
            }
        }
    }, {
        $limit : 5
    }
]);
3 голосов
/ 06 декабря 2016

Я нашел бесплатный инструмент для перевода запросов MYSQL в MongoDB.http://www.querymongo.com/ Я проверил несколько запросов.как я вижу, почти все они верны.В соответствии с этим, ответ

db.users.find({
    "name": "%m%"
});
2 голосов
/ 27 января 2017

MongoRegex устарел.
Использовать MongoDB \ BSON \ Regex

$regex = new MongoDB\BSON\Regex ( '^m');
$cursor = $collection->find(array('users' => $regex));
//iterate through the cursor
1 голос
/ 02 июня 2017
db.customer.find({"customerid": {"$regex": "CU_00000*", "$options": "i"}}).pretty()

Когда мы ищем строковые шаблоны, всегда лучше использовать вышеупомянутый шаблон, когда мы не уверены в регистре. Надеюсь, это поможет !!!

1 голос
/ 06 мая 2017

FullName как «последний» со статусом == «Ожидает» между двумя датами:

db.orders.find({
      createdAt:{$gt:ISODate("2017-04-25T10:08:16.111Z"),
      $lt:ISODate("2017-05-05T10:08:16.111Z")},
      status:"Pending",
      fullName:/last/}).pretty();

status == «Ожидает» и orderId LIKE «PHA876174»

db.orders.find({
     status:"Pending",
     orderId:/PHA876174/
     }).pretty();
...