8

如何在 PyMongo 中将 $regex 与 $in 结合使用?

我想搜索/*.heavy.*//*.metal.*/

我在 python 中尝试过但没有成功:

db.col.find({'music_description' : { '$in' : [ {'$regex':'/*.heavy.*/'} ]} })

Mongo shell 中的等价物是:

db.inventory.find( { music_description: { $in: [ /heavy/, /metal/ ] } } )
4

2 回答 2

15

使用 python 正则表达式。

import re
db.col.find({'music_description': {'$in': [ re.compile('.*heavy.*'), re.compile('.*metal.*')]}})
于 2013-12-16T22:53:37.257 回答
6

为什么还要费心使用 $in?您通过评估列表中每个值的字段来浪费处理,并且由于每个值都是正则表达式,因此它有自己的性能考虑因素,根据您的查询字符串获得多长时间,将它们包装在一个中可能是谨慎的正则表达式并避免一起使用 $in 查询

import re
db.col.find({'music_description': re.compile('heavy|metal')})

同样在 mongo shell

db.inventory.find({music_description: /heavy|metal/})

至于 [user2998367] 的答案,您正在浪费效率编译带有贪婪通配符的正则表达式,仅用于匹配目的,python 中 re.search 和 re.match 之间的区别需要使用通配符进行 re.search目的,但 re.match 的行为类似于“字符串中的任何位置”,MongoDB 也是如此,只有在您打算提取时才真正需要它,无论如何查询后您需要稍后执行此操作,或者如果您正在重用已编译的在其他地方你特别需要 re.search 而不是 re.match 的正则表达式

于 2015-04-14T06:35:09.883 回答