Я хочу сделать запрос с помощью запроса SQL like
:
SELECT * FROM users WHERE name LIKE '%m%'
Как мне добиться того же в MongoDB? Я не могу найти оператора для like
в документации.
Я хочу сделать запрос с помощью запроса SQL like
:
SELECT * FROM users WHERE name LIKE '%m%'
Как мне добиться того же в MongoDB? Я не могу найти оператора для like
в документации.
Это должно быть:
db.users.find({"name": /.*m.*/})
или, аналогично:
db.users.find({"name": /m/})
Вы ищете что-то, что содержит "m" где-то (SQL '%
' оператор эквивалентен Regexp '.*
'), а не то, что имеет "m", привязанное к началу строки.
db.users.insert({name: 'paulo'})
db.users.insert({name: 'patric'})
db.users.insert({name: 'pedro'})
db.users.find({name: /a/}) //like '%a%'
out: paulo, patric
db.users.find({name: /^pa/}) //like 'pa%'
out: paulo, patric
db.users.find({name: /ro$/}) //like '%ro'
out: pedro
В
вы можете сделать:
db.users.find({'name': {'$regex': 'sometext'}})
В PHP вы можете использовать следующий код:
$collection->find(array('name'=> array('$regex' => 'm'));
Вы использовали бы регулярное выражение для этого в mongo.
например: db.users.find({"name": /^m/})
Уже есть много ответов. Я даю разные типы требований и решений для поиска строк с регулярным выражением.
Вы можете делать с регулярным выражением, которое содержит слово i.e. Также вы можете использовать $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'}})
Храните этот в качестве закладки и ссылку на любые другие изменения, которые могут вам понадобиться.
Если вы используете 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') } );
У вас есть 2 варианта:
db.users.find({"name": /string/})
или
db.users.find({"name": {"$regex": "string", "$options": "i"}})
Во втором случае у вас есть больше опций, например, "i" в параметрах, которые можно найти с помощью нечувствительности к регистру. И о "строке", вы можете использовать как ".string". (% string%) или строка "." (строка%) и строка ". *) (например, строка%). Вы можете использовать регулярное выражение, как хотите.
Наслаждайтесь!
У вас уже есть ответы, но для соответствия регулярному выражению с нечувствительностью к регистру
Вы можете использовать следующий запрос
db.users.find ({ "name" : /m/i } ).pretty()
i
в /m/i
указывает нечувствительность к регистру, а .pretty()
обеспечивает более симпатичный вывод
Для Mongoose в Node.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 mongo Like.
У меня было несколько вопросов с php mongo. Я обнаружил, что объединение параметров регулярного выражения помогает в некоторых ситуациях PHP mongo find field начинается с. Я полагал, что буду публиковать здесь, чтобы внести вклад в более популярный поток
например
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)
В 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
Метод add pretty()
будет использоваться во всех местах, где можно создать форматированную структуру JSON, которая более читаема.
В проекте 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);
});
С MongoDB Compass вам нужно использовать синтаксис строгого режима, как таковой:
{ "text": { "$regex": "^Foo.*", "$options": "i" } }
(В MongoDB Compass важно использовать "
вместо '
)
Вы можете использовать инструкцию where для создания любого JS script:
db.myCollection.find( { $where: "this.name.toLowerCase().indexOf('m') >= 0" } );
Ссылка: http://docs.mongodb.org/manual/reference/operator/where/
В Go и драйвер mgo:
Collection.Find(bson.M{"name": bson.RegEx{"m", ""}}).All(&result)
где result является экземпляром struct искомого типа
Используйте регулярные выражения, как показано ниже. "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);
Regex - дорогостоящий процесс.
Другой способ - создать индекс текста, а затем выполнить поиск с помощью $search
.
Создание текста Индекс полей, которые вы хотите сделать доступными для поиска:
db.collection.createIndex({name: 'text', otherField: 'text'});
Поиск строки в текстовом индексе:
db.collection.find({
'$text'=>{'$search': "The string"}
})
Подобный запрос будет выглядеть так, как показано ниже
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]
Похоже, что есть причины использовать как шаблон 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" }
Использование шаблонных литералов с переменными также работает:
{"firstname": {$regex: '^${req.body.firstname}.*', $options: 'si' }}
Если вы используете 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});
Если вы хотите "Like" искать в mongo, тогда вы должны пойти с $regex, используя этот запрос будет
db.product.find({name:{$regex:/m/i}})
Для получения дополнительной информации вы также можете ознакомиться с документацией. https://docs.mongodb.com/manual/reference/operator/query/regex/
Я нашел бесплатный инструмент для перевода запросов MYSQL в MongoDB. http://www.querymongo.com/ Я проверил несколько запросов. как я вижу, почти все они верны. В соответствии с этим, ответ
db.users.find({
"name": "%m%"
});
Используйте поиск подстроки агрегирования (с индексом !!!):
db.collection.aggregate([{
$project : {
fieldExists : {
$indexOfBytes : ['$field', 'string']
}
}
}, {
$match : {
fieldExists : {
$gt : -1
}
}
}, {
$limit : 5
}
]);
MongoRegex устарел.
Используйте MongoDB\BSON\Regex
$regex = new MongoDB\BSON\Regex ( '^m');
$cursor = $collection->find(array('users' => $regex));
//iterate through the cursor
db.customer.find({"customerid": {"$regex": "CU_00000*", "$options": "i"}}).pretty()
Когда мы ищем строковые шаблоны, всегда лучше использовать приведенный выше шаблон, как если бы мы не были уверены в случае. Надеюсь, что поможет!!!
Если вы используете 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);
}