Mongodb query PyMongo$in+$正则表达式

Mongodb query PyMongo$in+$正则表达式,mongodb-query,pymongo,Mongodb Query,Pymongo,如何在PyMongo中将$regex与$in组合 我想搜索/*.heavy.*/或/*.metal.*/ 我尝试了python,但没有成功: db.col.find({'music_description' : { '$in' : [ {'$regex':'/*.heavy.*/'} ]} }) Mongo shell中的等效物为: db.inventory.find( { music_description: { $in: [ /heavy/, /metal/ ] } } ) 使用pyth

如何在PyMongo中将$regex与$in组合

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

我尝试了python,但没有成功:

db.col.find({'music_description' : { '$in' : [ {'$regex':'/*.heavy.*/'} ]} })
Mongo shell中的等效物为:

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

使用python正则表达式

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

使用python正则表达式

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

为什么还要麻烦使用$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.match的行为就像“字符串中的任意位置”,MongoDB一样,只有当您打算提取时才真正需要它,不管怎样,在查询之后都需要这样做,或者如果您在其他地方重用编译好的正则表达式,您特别需要对re.match进行重新搜索

为什么还要麻烦使用$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.match的行为就像“字符串中的任意位置”,MongoDB一样,只有当您打算提取时才真正需要它,不管怎样,查询之后都需要这样做,或者如果您在其他地方重用编译的正则表达式,您特别需要重新搜索而不是重新匹配。工作起来很有魅力。不知何故,尽管它很合适,但它也不是很明显——某种类型的正则表达式字符串似乎是更明显的选择(我想这是因为从字符串转换为编译正则表达式,然后再转换回bson的字符串)。谢谢你的帖子。工作起来很有魅力。不知何故,尽管它很合适,但它也不是很明显——某种类型的正则表达式字符串似乎是更明显的选择(我想这是因为从字符串转换为编译正则表达式,然后再转换回bson的字符串)。谢谢你的帖子。他正在尝试检查数组元素,而不是“音乐描述”本身。查询中的
$in
是一个具有多种用途的比较多样化的查询。第一个是明显的用例,它读作“一些左手值在这个可能的右手值数组中”,这就是他在这里查询的内容(名称
music\u description
决不表示它是一个值数组…),另一个用途是您所想的,即“此数组左侧值包含一个或任意这些右侧值”,也可以写成
db.s.find({'someArray':{$in:oneValue}})
而不是数组,最后也可以写成
db.s.find({'someArray':oneValue})
为简洁起见…继续并出于本查询的目的,由于右侧的值是正则表达式的值,因此单独处理每个正则表达式几乎毫无意义,而只是将它们作为一个正则表达式进行匹配。他试图检查数组元素,而不是“音乐描述”“本身。查询中的
$in是一个具有多种用途的非常多样化的查询。第一个是明显的用例,它读作“一些左手值在这个可能的右手值数组中”,这就是他在这里查询的内容(名称
music\u description
决不表示它是一个值数组…),另一个用途是您所想的,即“此数组左侧值包含一个或任意这些右侧值”,也可以写成
db.s.find({'someArray':{$in:oneValue}})
而不是数组,最后也可以写成
db.s.find({'someArray':oneValue})
为简洁起见…继续并出于本查询的目的,由于右侧的值是正则表达式的值,因此单独处理每个正则表达式几乎没有意义,而只是将它们作为一个进行匹配