How to query MongoDB with “like”?
我想用SQL的
1 | SELECT * FROM users WHERE name LIKE '%m%' |
如何在MongoDB中实现相同的目标?我在文档中找不到
那必须是:
1 | db.users.find({"name": /.*m.*/}) |
或者,类似:
1 | db.users.find({"name": /m/}) |
您要查找的是某处包含"m"的内容(SQL的"EDOCX1"(1)运算符相当于regexp的"EDOCX1"(2)),而不是将"m"锚定到字符串开头的内容。
1 2 3 4 5 | db.users.insert({name: 'paulo'}) db.users.insert({name: 'patric'}) db.users.insert({name: 'pedro'}) db.users.find({name: /a/}) //LIKE '%a%' |
外出:保罗,帕特里克
1 | db.users.find({name: /^pa/}) //LIKE 'pa%' |
外出:保罗,帕特里克
1 | db.users.find({name: /ro$/}) //LIKE '%ro' |
外:佩德罗
在
- 使用python的pymongo
- Mongoose使用node.js
- Jongo,使用Java
- 氧化镁
你可以做到:
1 | db.users.find({'name': {'$regex': 'sometext'}}) |
在PHP中,可以使用以下代码:
1 | $collection->find(array('name'=> array('$regex' => 'm')); |
在Mongo中,您可以使用regex。
例如:
答案已经很多了。我给出了使用regex进行字符串搜索的不同类型的需求和解决方案。
您可以使用包含单词i.e like的regex。也可以使用
包含
1 | db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}}) |
不包含仅包含regex的
1 | db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}}) |
精确不区分大小写
1 | db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}}) |
从
1 | db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}}) |
以
1 | db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}}) |
请将此作为书签保存,并为您可能需要的任何其他更改提供参考。
如果使用node.js,则说明可以编写以下内容:
1 2 3 | db.collection.find( { FIELD: /acme.*corp/i } ); //OR db.collection.find( { FIELD: { $regex: 'acme.*corp', $options: 'i' } } ); |
此外,您还可以写下:
1 | db.collection.find( { FIELD: NEW REGEXP('acme.*corp', 'i') } ); |
您有两个选择:
1 | db.users.find({"name": /string/}) |
或
1 | db.users.find({"name": {"$regex":"string","$options":"i"}}) |
在第二个选项中,您有更多的选项,比如"i",可以使用不区分大小写的选项来查找。关于"字符串",您可以使用像".string."(%string%)或"string.*"(string%)和".*string")(%string)这样的方法。可以根据需要使用正则表达式。
享受!
你已经得到答案了,但是要匹配regex和case不敏感
您可以使用以下查询
1 | db.users.find ({"name" : /m/i } ).pretty() |
对于node.js中的mongoose
1 | db.users.find({'name': {'$regex': '.*sometext.*'}}) |
像php mongo。我对php mongo有几个问题。我发现连接regex参数有助于在某些情况下php mongo find字段以开头。我想我会在这里发表文章,为更受欢迎的主题做贡献。
例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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) |
您可以使用2.6 MongoDB的新功能:
1 2 3 4 5 6 7 8 | 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" } }); |
在nodejs项目中使用mongoose,使用like查询
1 2 3 4 5 6 7 8 9 10 11 | 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); }); |
在SQL中,"like"查询如下所示:
1 | SELECT * FROM users WHERE name LIKE '%m%' |
在MongoDB控制台中,如下所示:
1 2 3 | db.users.find({"name": /m/}) // NOT JSON formatted db.users.find({"name": /m/}).pretty() // JSON formatted |
另外,
在Go和MGO驱动程序中:
1 | Collection.Find(bson.M{"name": bson.RegEx{"m",""}}).All(&RESULT) |
其中,result是请求后类型的结构实例
可以使用WHERE语句构建任何JS脚本:
1 | db.myCollection.find( { $where:"this.name.toLowerCase().indexOf('m') >= 0" } ); |
参考:http://docs.mongodb.org/manual/reference/operator/where/
使用MongoDB Compass,需要使用严格的模式语法,例如:
1 | {"text": {"$regex":"^Foo.*","$options":"i" } } |
(在MongoDB指南针中,使用
使用如下匹配的正则表达式。"i"表示不区分大小写。
1 2 3 4 5 6 7 8 9 10 11 12 | 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); |
like查询如下所示
1 | db.movies.find({title: /.*Twelve Monkeys.*/}).sort({regularizedCorRelation : 1}).limit(10); |
对于scala reactiveMogo API,
1 2 3 | 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] |
REGEX是昂贵的工艺。
另一种方法是创建文本索引,然后使用
创建要使其可搜索的字段的文本索引:
1 | db.collection.createIndex({name: 'text', otherField: 'text'}); |
在文本索引中搜索字符串:
1 2 3 | db.collection.find({ '$text'=>{'$search':"The string"} }) |
如果您想在mongo中进行"like"搜索,那么您应该使用$regex,使用该查询将
更多信息,您也可以阅读文档。https://docs.mongodb.com/manual/reference/operator/query/regex网站/
如果您使用的是SpringDataMongoDB,那么可以这样做:
1 2 3 4 | String tagName ="m"; Query query = NEW Query(); query.limit(10); query.addCriteria(Criteria.where("tagName").regex(tagName)); |
似乎有理由同时使用javascript
这不是一个完整的regex教程,但是在看到上面一个高度模糊的帖子后,我被启发去运行这些测试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | > ['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" } |
由于MongoShell支持regex,这是完全可能的。
1 | db.users.findOne({"name" : /.*sometext.*/}); |
如果我们希望查询不区分大小写,可以使用"i"选项,如下所示:
1 | db.users.findOne({"name" : /.*sometext.*/i}); |
我找到了一个免费的工具来将mysql查询翻译成mongodb。http://www.querymongo.com/我查了好几个问题。正如我看到的,几乎所有的都是正确的。根据这一点,答案是
1 2 3 | db.users.find({ "name":"%m%" }); |
使用聚合子字符串搜索(带索引!!!!):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | db.collection.aggregate([{ $project : { fieldExists : { $indexOfBytes : ['$field', 'string'] } } }, { $match : { fieldExists : { $gt : -1 } } }, { $limit : 5 } ]); |
使用带变量的模板文本也可以:
MongoRegex已被弃用。使用mongodbson
egex
1 2 3 4 | $regex = NEW MongoDB\BSON egex ( '^m'); $cursor = $collection->find(array('users' => $regex)); //iterate through the cursor |
1 | db.customer.find({"customerid": {"$regex":"CU_00000*","$options":"i"}}).pretty() |
当我们搜索字符串模式时,最好使用上面的模式,因为我们不确定大小写。希望有帮助!!!!
全名,如"last",状态为"='pending",介于两个日期之间:
1 2 3 4 5 | 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':
1 2 3 4 | db.orders.find({ STATUS:"Pending", orderId:/PHA876174/ }).pretty(); |
1 2 3 4 | >> db.car.distinct('name') ["honda","tat","tata","tata3" ] >> db.car.find({"name":/. *ta.* /}) |
您还可以使用通配符过滤器,如下所示:
1 | {"query": {"wildcard": {"lookup_field":"search_string*"}}} |
一定要使用
如果您使用的是PHP,那么可以使用MongoDB_DataObject包装器,如下所示:
1 2 3 4 5 6 7 | $model = NEW MongoDB_DataObject(); $model->query("select * from users where name like '%m%'"); while($model->fetch()) { var_dump($model); } |
或:
1 2 3 4 5 6 7 8 9 | $model = NEW MongoDB_DataObject('users); $model->whereAdd("name like '%m%'"); $model->find(); while($model->fetch()) { var_dump($model); } |