PyMongo $ in + $ regex

Dio*_*lor 6 pymongo mongodb-query

如何在PyMongo中将$ regex与$ in结合起来?

我想搜索其中一个/*.heavy.*//*.metal.*/.

我在python中尝试没有成功:

db.col.find({'music_description' : { '$in' : [ {'$regex':'/*.heavy.*/'} ]} })
Run Code Online (Sandbox Code Playgroud)

Mongo shell中的等价物是:

db.inventory.find( { music_description: { $in: [ /heavy/, /metal/ ] } } )
Run Code Online (Sandbox Code Playgroud)

小智 12

使用python正则表达式.

import re
db.col.find({'music_description': {'$in': [ re.compile('.*heavy.*'), re.compile('.*metal.*')]}})
Run Code Online (Sandbox Code Playgroud)


apo*_*pse 5

为什么甚至打扰使用$ in?您通过评估列表中每个值的字段来浪费处理,并且由于每个值都是正则表达式,因此它有自己的性能注意事项,根据查询字符串的获取时间长短,将它们包装在一个中可能是谨慎的.正则表达式和避免$ in查询一起

import re
db.col.find({'music_description': re.compile('heavy|metal')})
Run Code Online (Sandbox Code Playgroud)

同样在mongo shell中

db.inventory.find({music_description: /heavy|metal/})
Run Code Online (Sandbox Code Playgroud)

对于[user2998367]的回答,你正在浪费效率编译正则表达式与贪婪的通配符只是为了匹配,re.search和python中的re.match之间的区别需要使用通配符进行re.search目的,但re.match表现为'字符串中的任何位置',MongoDB也是如此,如果你打算提取它,它只是真正需要的,无论如何你需要在以后查询,或者如果你重新使用已编译的regex在其他地方,你特别需要re.search对re.match