如何在MongoDB中使用“不喜欢”运算符


98

我可以使用SQL Like操作符pymongo

db.test.find({'c':{'$regex':'ttt'}})

但是如何使用Not Like运算符?

我试过了

db.test.find({'c':{'$not':{'$regex':'ttt'}})

但出现错误:

OperationFailure:$ not不能有正则表达式


1
我知道这有点晚了,但是在MongoDB 4.2中,$notand $regex运算符的组合似乎对我有用。
b00r00x0

Answers:


138

文档

$ not运算符不支持$ regex运算符的操作。而是使用//或在驱动程序界面中,使用语言的正则表达式功能来创建正则表达式对象。考虑下面的示例,该示例使用模式匹配表达式//:

db.inventory.find( { item: { $not: /^p.*/ } } )

编辑(@idbentley):

{$regex: 'ttt'}通常等效/ttt/于mongodb,因此您的查询将变为:

db.test.find({c: {$not: /ttt/}}

EDIT2(@KyungHoon Kim):

python中,以下一项有效:

'c':{'$not':re.compile('ttt')}

2
需要明确的 {$regex: 'ttt'}是,通常等同/ttt/于mongodb,因此您的查询将变为db.test.find({c: {$not: /ttt/}}
idbentley13年

@idbentley谢谢。我用您的澄清更新了答案。
shx2

1
非常感谢。对于其他人,我用过'c':{'$not':re.compile('ttt')}。当然,您需要重新输入
KyungHoon Kim 2013年

大。为了后代,我也将您的评论添加到了答案中。
shx2

1
$ ne和$ regex似乎情况相同。任何人都可以确认或至少添加吗?
DBrown

55

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

将其保留为书签,并作为您可能需要的其他更改的参考。 http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.