在pymongo中使用正则表达式搜索
我正在尝试在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 个回答
首先,你需要告诉mongodb这个字符串应该被当作正则表达式来处理,使用$regex
操作符:
cursor = collection.find({'multiple.layers.of.data' : {'$regex': REGEX}})
我觉得简单地把REGEX = '.*\.com'
替换成import re; REGEX = re.compile('.*\.com')
也可能有效,但我不太确定(这可能依赖于pymongo
驱动的具体处理方式)。
补充:
关于问题中的通配符部分:答案是否定的。
简单来说,未知的值不应该被当作键,因为这样会让查询变得非常低效。没有“通配符”查询。
更好的做法是重新设计数据库,使得未知的值不作为键。
参考链接:
http://groups.google.com/group/mongodb-user/browse_thread/thread/32b00d38d50bd858
https://groups.google.com/forum/#!topic/mongodb-user/TnAQMe-5ZGs