题 如何用“喜欢”查询MongoDB?


我想查询一些东西为SQL like 查询:

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

如何在MongoDB中做同样的事情?
我找不到运营商 like 在里面 单证


1065
2017-07-22 03:19


起源


请参阅mongodb的文档:高级查询 - 正则表达式 mongodb.org/display/DOCS/... - douyw
你的问题至少有 5 投票给 像运营商 标签。我可以请求你的建议 类似SQL的 作为一个 代名词? - Kermit
这个链接可以帮到你 goo.gl/gdTYK8 - Singh


答案:


那必须是:

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

或者,类似的:

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

你正在寻找某处包含“m”的东西(SQL''%'运营商相当于Regexp的'.*'),而不是“m”锚定到字符串开头的东西。


1436
2017-07-22 03:57



正在寻找昂贵的正则表达式? - Freewind
实际上,这取决于。如果查询不使用索引,并且必须进行表扫描,那么它肯定会很昂贵。如果您正在使用'start with'正则表达式查询,那么可以使用索引。最好运行一个explain()来看看发生了什么。 - Kyle Banker
当没有锚定到字符串的开头时,它有点贵。但话说回来,也是如此 LIKE 在SQL中查询。 - Emily
所以只要它固定在字符串的开头就可以了吗?然后很酷。这是否意味着我们需要添加^ - J. Chang
我会添加正则表达式我 javascript db.users.find({ "name": { $regex: /m/i } }) - Doron Segal


db.users.insert({name: 'paulo'})
db.users.insert({name: 'patric'})
db.users.insert({name: 'pedro'})

db.users.find({name: /a/})  //like '%a%'

出:paulo,patric

db.users.find({name: /^pa/}) //like 'pa%' 

出:paulo,patric

db.users.find({name: /ro$/}) //like '%ro'

出:佩德罗


240
2018-05-20 13:26



很好的例子!我发现检查结束空间,发现这个:) / $ / - Phuong
你怎么找到名字的所有条目?或者SQL中的*通配符?做的事情 select name from users; 哪个只列出了所有用户? - anon58192932
@ anon58192932要显示名为“users”的表中只有“name”字段的所有条目,可以通过设置所需字段的值来使用project()方法1.项目()中未提及的字段不会是取出除_id之外。默认打印_id字段,您可以通过在project()方法中为_id添加0值来抑制。类似于 - db.collection.find()。project({name:1,_id:0})。toArray(function(err,docs){console.log(docs); callback(docs);});参考这个 - docs.mongodb.com/manual/tutorial/... - gauravparmar


  • PyMongo 运用 蟒蛇
  • 猫鼬 运用 Node.js的 
  • Jongo,使用 Java的
  • 氧化镁,使用

你可以做:

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

190
2017-10-07 17:07



它适用于区分大小写的搜索,你能否告诉我如何让它能够执行不区分大小写的搜索? - Tahir Yasin
什么是正则表达式 %sometext% - Tahir Yasin
@TahirYasin如果你还在想,不区分大小写的搜索会像这样完成: db.users.find({'name': {'$regex': 'sometext', '$options': 'i'}}) - sumowrestler
我使用mgo解决了golang这样的代码,选择器:= bson.M {“技术人员”:bson.M {“$ regex”:tech}} - Sandun Priyanka
@SandunPriyanka mgo库有一个内置的正则表达式,你应该使用 bson.M{"technician", bson.RegEx{Pattern: tech}} 相反(但要确保 tech 已被消毒,否则你有一个正则表达式注入漏洞!) - kbolino


在PHP中,您可以使用以下代码:

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

74
2018-05-13 08:36



python + mongoengine:people = People.objects.raw_query({'name':{'$ regex':'m'}}) - panchicore
如果您的RegEx值来自用户输入(例如过滤器表单)并且您不希望将值本身视为RegExp,则可以对其应用preg_quote()。 - Philipp Rieber
我刚刚意识到这一点,但这实际上是错误的答案,即使它工作在次优,你应该通过MongoRegex使用实际的BSON正则表达式对象,$ regex与某些命令(如$ in)存在兼容性问题 - Sammaye
如果值存储在变量中,则此语法很有用,因此查询可以写为(在Ruby中): $collection.where(field => {"$regex" => value}) - Donny Kurnia
但为什么你不能使用数组文字? - Alper


你可以在mongo中使用正则表达式。

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


42
2017-07-22 03:48



我认为这只显示名称值以“m”开头的文档 - JackAce


如果使用 的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') } );

24
2018-03-09 06:11



Ruby中的类似语法: collection.where(field => Regexp.new(value)) - Donny Kurnia


已经有很多答案了。我正在为正则表达式的字符串搜索提供不同类型的要求和解决方案。

您可以使用包含单词的正则表达式,例如。你也可以使用 $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'}})

保持 这个 作为书签,以及您可能需要的任何其他更改的参考。


22
2017-08-11 15:39





你已经得到了答案,但是要将正则表达式与不区分大小写相匹配

您可以使用以下查询

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

i 在里面 /m/i 表示不区分大小写 .pretty() 提供更漂亮的输出


14
2017-11-21 05:39





你有2个选择:

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

要么

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

在第二个上你有更多选项,比如“i”在选项中查找使用不区分大小写。 关于“字符串”,你可以使用“。串。例如,“(%string%),或”string。*“(字符串%)和”。* string“(%string)。您可以根据需要使用正则表达式。

请享用!


13
2018-04-26 02:48