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处理正则表达式的情况

如何在 pymongo 中正确设计正则表达式?

Pymongo $regexMatch 正则表达式选项中的无效标志:u

如何使用正则表达式查询 pymongo 以获取仅包含数字的值

使用正则表达式元素数组的 MongoDB 查询 $in

使用正则表达式元素数组的 MongoDB 查询 $in