在pymongo中使用正则表达式搜索

1 投票
1 回答
12677 浏览
提问于 2025-04-18 03:39

我正在尝试在pymongo中使用正则表达式(REGEX)进行搜索。匹配到数据后,我希望把这些数据添加到一个列表里。我以为我已经设置好了,但无论我怎么设置正则表达式,结果总是返回0。下面是我的代码:

REGEX = '.*\.com'

def myModule(self, data)
    #after importing everything and setting up the collection function in the DB I call the following:
    cursor = collection.find({'multiple.layers.of.data' : REGEX})
    data = []
    for x in cursor:
        matches.append(x)
    return matches

这是我用来过滤存储在mongodb中的大量json文件的三个模块中的一个。不过,无论我怎么改变格式,比如把/.*.com/放到操作里,或者在mongo中使用$regex...它始终找不到我的数据,也无法把它添加到列表中。

编辑:我添加了完整的代码,以及我想要识别的内容:

RegEx = '.*\.com' #Or RegEx = re.compile('.*\.com')

def filterData(self, data):
       db = self.client[self.dbName]
       collection = db[self.collectionName]
       cursor = collection.find({'data.item11.sub.level3': {'$regex': RegEx}})
       data = []
       for x in cursor:
           data.append(x)
       return data

我正在尝试解析mongodb中的JSON数据。数据的结构是这样的:

"data": {
    "0": {
        "item1": "something",
        "item2": 0,
        "item3": 000,
        "item4": 000000000,
        "item5": 000000000,
        "item6": "0000",
        "item7": 00,
        "item8": "0000",
        "item9": 00,
        "item10": "useful",
        "item11": {
            "0000": {
                "sub": {
                    "level": "letter",
                    "level1": 0000,
                    "level2": 0000000000,
                    "level3": "domain.com"
                },
                "more_data": "words"
            }
        }
    }

更新:经过进一步测试,我发现我需要在搜索中包含所有层级。因此,它应该看起来像这样:

collection.find({'data.0.item11.0000.sub.level3': {'$regex': RegEx}})

不过,这里的“0”可以是1到50,而“0000”是随机生成的。有没有办法把这些设置为变量索引,这样无论值是什么,它都能进入?它总是一个数字值。

1 个回答

6

首先,你需要告诉mongodb这个字符串应该被当作正则表达式来处理,使用$regex操作符:

cursor = collection.find({'multiple.layers.of.data' : {'$regex': REGEX}})

我觉得简单地把REGEX = '.*\.com'替换成import re; REGEX = re.compile('.*\.com')也可能有效,但我不太确定(这可能依赖于pymongo驱动的具体处理方式)。


补充:

关于问题中的通配符部分:答案是否定的。

简单来说,未知的值不应该被当作键,因为这样会让查询变得非常低效。没有“通配符”查询。

更好的做法是重新设计数据库,使得未知的值不作为键。

参考链接:

MongoDB查询中的通配符

http://groups.google.com/group/mongodb-user/browse_thread/thread/32b00d38d50bd858

https://groups.google.com/forum/#!topic/mongodb-user/TnAQMe-5ZGs

撰写回答