PyMongo $in + $正则表达式
Posted
技术标签:
【中文标题】PyMongo $in + $正则表达式【英文标题】:PyMongo $in + $regex 【发布时间】:2013-11-20 22:54:52 【问题描述】:如何在 PyMongo 中将 $regex 与 $in 结合使用?
我想搜索/*.heavy.*/
或/*.metal.*/
。
我在 python 中尝试过但没有成功:
db.col.find('music_description' : '$in' : [ '$regex':'/*.heavy.*/' ] )
Mongo shell 中的等价物是:
db.inventory.find( music_description: $in: [ /heavy/, /metal/ ] )
【问题讨论】:
【参考方案1】:使用 python 正则表达式。
import re
db.col.find('music_description': '$in': [ re.compile('.*heavy.*'), re.compile('.*metal.*')])
【讨论】:
嗯。奇迹般有效。不知何故,尽管它很合适,但它也不是很明显——某种正则表达式字符串似乎是更明显的选择(我想是因为从字符串转换为已编译的正则表达式,然后再转换为 bson 的字符串)。谢谢你的帖子。【参考方案2】:为什么还要费心使用 $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 的其他地方重用已编译的正则表达式
【讨论】:
他正在尝试检查数组元素,而不是“music_description”本身。$in
查询是一种用途广泛的查询。第一个是明显的用例,它读作“一些左手值在这个可能的右手值数组中”,这就是他似乎在这里查询的内容(名称music_description
绝不表示它是值数组...)另一种用途是您正在考虑的,“此数组左手值包含这些右手值中的一个或任何一个”,也可以写为db.s.find('someArray': $in: oneValue)
而不是最后,为简洁起见,该数组也称为db.s.find('someArray': oneValue)
以上是关于PyMongo $in + $正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
Pymongo $regexMatch 正则表达式选项中的无效标志:u