Как запросить MongoDB с помощью "like"?
Я хочу запросить что-то как SQL like
запрос:
select *
from users
where name like '%m%'
как сделать то же самое в MongoDB?
Я не могу найти оператора like
на документация.
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'));
уже есть много ответов. Я даю различные типы требований и решений для поиска строк с регулярным выражением.
вы можете сделать с регулярным выражением, которое содержит слово т. е. нравится. Также вы можете использовать
$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()
обеспечивает более красивый выход
вы можете использовать новую функцию 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();