【问题标题】:REGEX Searching in pymongo正则表达式在 pymongo 中搜索
【发布时间】:2014-06-06 02:41:35
【问题描述】:

我正在尝试使用 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”是随机生成的。有没有办法将这些设置为索引作为变量,以便无论值是什么它都会进入它?它始终是一个数字值。

【问题讨论】:

    标签: python regex mongodb pymongo


    【解决方案1】:

    好吧,你需要告诉 mongodb 字符串应该被视为正则表达式,使用 $regex 运算符:

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

    我认为简单地将REGEX = '.*\.com' 替换为import re; REGEX = re.compile('.*\.com') 也可能有效,但我不确定(将依赖于pymongo 驱动程序中的特定处理)。


    编辑:

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

    简而言之,未知的值应该 永远不要被分配为键,因为它使查询非常低效。 没有“通配符”查询。

    最好重组数据库,使 未知不是键

    见:

    MongoDB wildcard in the key of a query

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

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

    【讨论】:

    • 不幸的是,我已经尝试了这两种方法,但仍然遇到同样的问题。我可以看出脚本正在搜索数据,但匹配项从未附加到我的列表中。
    • @user3413087 你不是错过了'0'级别吗?不应该是'data.0.item11 ....'吗?
    • 是和否....您可以在 mongodb 中搜索级别,我已经在其他部分进行了搜索。可能是这样,如果是这样,那么我还有另一个问题。 “0”和“0000”级别的数字是随机的。此外,第一个 (0) 在 data 下返回的每个项目都会增加 1,而我的数据通常从 2 开始,可以达到 20+。这就是为什么我试图跳过专门识别它们的原因。我看过一些显示跳过关卡的文档,并认为这没问题。
    • 你是对的,我需要列出其他层。我测试了它并且它有效。话虽这么说,这两层需要是一个变量......有没有办法做到这一点?
    • 感谢您的信息。这是非常不幸的......我无法重新构建数据,因为我无法控制它,所以我需要找到另一种方法来解决这个问题。再次感谢。
    猜你喜欢
    • 2012-10-24
    • 2023-04-07
    • 2016-12-20
    • 2013-11-20
    • 1970-01-01
    • 2011-04-08
    • 2014-06-02
    • 2023-04-10
    相关资源
    最近更新 更多