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

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

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

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

Ответы [ 33 ]

11 голосов
/ 18 сентября 2014

Для PHP Монго Лайк.
У меня было несколько проблем с php Монго Лайк.я обнаружил, что объединение параметров регулярных выражений помогает в некоторых ситуациях Поле поиска 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)
10 голосов
/ 04 августа 2014

Вы можете использовать новую функцию 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"
    }
});
9 голосов
/ 11 августа 2015

В nodejs проект и использование mongoose Как запрос

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);
            });
8 голосов
/ 19 апреля 2017

В MongoDB Compass вам необходимо использовать синтаксис строгого режима, например:

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

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

8 голосов
/ 19 марта 2014

В SQL запрос ' like ' выглядит следующим образом:

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

В консоли MongoDB он выглядит следующим образом:

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

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

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

7 голосов
/ 18 марта 2014

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

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

, где result - это экземпляр структуры искомого типа

7 голосов
/ 05 сентября 2013

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

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

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

7 голосов
/ 11 декабря 2015

Используйте совпадения регулярных выражений, как показано ниже. «I» показывает нечувствительность к регистру.

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);
5 голосов
/ 18 мая 2015

Как и в случае запроса, как показано ниже

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]
5 голосов
/ 16 мая 2018

Regex - это дорогой процесс.

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

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

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

Поиск строки в текстовом указателе:

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