Как запросить MongoDB с помощью "like"?


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

select * 
from users 
where name like '%m%'

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

30 1095

30 ответов:

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

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

или похожие:

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

вы ищете что-то, что содержит "m" где-то (SQL '% 'оператор эквивалентен регулярному выражению'.*'), а не то, что имеет "m", привязанное к началу строки.

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'

аут: Педру

In

  • PyMongo используя Python
  • Мангуста используя узел.js
  • Джонго, используя Java
  • mgo, используя перейти

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

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

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

$collection->find(array('name'=> array('$regex' => 'm'));

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

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

при использовании узел.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') } );

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

вы можете сделать с регулярным выражением, которое содержит слово т. е. нравится. Также вы можете использовать $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'}})

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

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

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

или

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

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

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

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

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

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

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

для мангуста в узел.js

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

вы можете использовать новую функцию 2.6 mongodb:

db.foo.insert({desc: "This is a string with text"});
db.foo.insert({desc:"This is a another string with Text"});
db.foo.ensureIndex({"desc":"text"});
db.foo.find({
    $text:{
        $search:"text"
    }
});

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

Эл.г

db()->users->insert(['name' => 'john']);
db()->users->insert(['name' => 'joe']);
db()->users->insert(['name' => 'jason']);

// starts with
$like_var = 'jo';
$prefix = '/^';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);
output: (joe, john)

// contains
$like_var = 'j';
$prefix = '/';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);

output: (joe, john, jason)

In nodejs проект и использование Мангуст использовать как запрос

var User = mongoose.model('User');

var searchQuery={};
searchQuery.email = req.query.email;
searchQuery.name = {$regex: req.query.name, $options: 'i'};
User.find(searchQuery, function(error, user) {
                if(error || user === null) {
                    return res.status(500).send(error);
                }
                return res.status(200).send(user);
            });

вы можете использовать оператор where для построения любого сценария JS:

db.myCollection.find( { $where: "this.name.toLowerCase().indexOf('m') >= 0" } );

Ссылка:http://docs.mongodb.org/manual/reference/operator/where/

В SQL,‘как’ запрос выглядит так:

select * from users where name like '%m%'

в консоли MongoDB это выглядит так:

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

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

при этом pretty() метод будет во всех местах, где производят форматированную структуру JSON, которая является более читаемой.

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

var collections = mongoDatabase.GetCollection("Abcd");

var queryA = Query.And(
         Query.Matches("strName", new BsonRegularExpression("ABCD", "i")), 
         Query.Matches("strVal", new BsonRegularExpression("4121", "i")));

var queryB = Query.Or(
       Query.Matches("strName", new BsonRegularExpression("ABCD","i")),
       Query.Matches("strVal", new BsonRegularExpression("33156", "i")));

var getA = collections.Find(queryA);
var getB = collections.Find(queryB);

в Go и драйвер mgo:

Collection.Find(bson.M{"name": bson.RegEx{"m", ""}}).All(&result)

где результатом является экземпляр структуры искомого типа

Как запрос будет, как показано ниже

db.movies.find({title: /.*Twelve Monkeys.*/}).sort({regularizedCorRelation : 1}).limit(10);

для scala ReactiveMongo api,

val query = BSONDocument("title" -> BSONRegex(".*"+name+".*", "")) //like
val sortQ = BSONDocument("regularizedCorRelation" -> BSONInteger(1))
val cursor = collection.find(query).sort(sortQ).options(QueryOpts().batchSize(10)).cursor[BSONDocument]

С MongoDB Compass вам нужно использовать синтаксис строгого режима, как таковой:

{ "text": { "$regex": "^Foo.*", "$options": "i" } }

(в MongoDB Compass, важно, что вы используете " вместо ')

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

String tagName = "m";
Query query = new Query();
query.limit(10);        
query.addCriteria(Criteria.where("tagName").regex(tagName));

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

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

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

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

Если вы хотите " как " поиск в монго, то вы должны пойти с $regex с помощью этого запроса будет

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

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

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

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

> ['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" }

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

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

регулярное выражение дорого стоят процесс.

другой способ-создать индекс текста, а затем искать его с помощью $search.

создайте текстовый индекс полей, которые вы хотите сделать доступными для поиска:

db.collection.createIndex({name: 'text', otherField: 'text'});

поиск строки в текстовом индексе:

db.collection.find({
  '$text'=>{'$search': "The string"}
})

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

$regex = new MongoDB\BSON\Regex ( '^m');
$cursor = $collection->find(array('users' => $regex));
//iterate through the cursor

Если вы используете PHP, вы можете использовать MongoDB_DataObject фантик, как показано ниже:

$model = new MongoDB_DataObject();

$model->query("select * from users where name like '%m%'");

while($model->fetch()) {
    var_dump($model);
}

или:

$model = new MongoDB_DataObject('users);

$model->whereAdd("name like '%m%'");

$model->find();

while($model->fetch()) {
    var_dump($model);
}

полное имя, как "последний" со статусом== "ожидание" между двумя датами:

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== 'Pending' и orderId как 'PHA876174':

db.orders.find({
     status:"Pending",
     orderId:/PHA876174/
     }).pretty();
db.customer.find({"customerid": {"$regex": "CU_00000*", "$options": "i"}}).pretty()

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

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

db.collection.aggregate([{
        $project : {
            fieldExists : {
                $indexOfBytes : ['$field', 'string']
            }
        }
    }, {
        $match : {
            fieldExists : {
                $gt : -1
            }
        }
    }, {
        $limit : 5
    }
]);