我正在尝试使用REGEX在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".有没有办法将这些设置为索引作为变量,以便它无论价值多少都会进入它?它始终是一个数字值.
好吧,你需要告诉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