首页 > 解决方案 > 如何在 PyMongo 中使用 OR 语句和变量赋值?

问题描述

我正在处理推文。我想为每条推文分配品牌标题和广告标题。我正在使用 python 而不是严格的 mongo 工作,因为我想为即将发生的事件自动化这个过程。总的来说,我正在处理超过 70 万条推文。我想尽可能多地在 PyMongo 中工作,这样我的处理时间就可以变得又短又好。

以下代码与一个更广泛的脚本相关,该脚本在此之前收集和聚合推文。这仅与根据正则表达式值分配广告有关。我的问题是我的测试数据库中的所有推文都被更新为 TRUE,即使它们不包含分配的 RE 值。

col.update_many({},
                {'$set': {"AdName": 'x'} }
                )

col.update_many({"AdName": {"$exists": True}},
                [{'$set':
                    {'AdName':
                        {"$or":
                        [{'$eq':[{'text':re.compile('BudLight')},'TestAdName']}]
                        }
                    }
                  }
                ]
                )

我希望看到的事情发生

我正在尝试根据 or 语句中的 RE 值更新这些推文以保存特定的广告名称。之后,我将根据通过此过程分配的广告标题为每条推文分配一个品牌。

我假设我的更新语法可能不正确,但是 PyMongo 文档对于我正在尝试做的事情并没有那么有帮助。

另外: PyMongo 不支持条件语句中的 $regex 命令。

标签: python-3.xpymongotweets

解决方案


我能够更好地理解如何实现这个想法。

我的错误是将条件语句放在更新参数中。$or 函数在 的过滤器函数中效果更好update_many。满足过滤器后,我就可以充分更新 AdTitle。

# Avengers Endgame
col.update_many(
                {'$or' :
                        [
                         {'text': { '$regex' : 'avengers', '$options' : 'i'}},
                         {'text': { '$regex' : 'Avengers', '$options' : 'i'}},
                         {'text': { '$regex' : 'Endgame', '$options' : 'i'}},
                         {'text': { '$regex' : 'endgame', '$options' : 'i'}},
                         {'text': { '$regex' : 'avengers endgame', '$options' : 'i'}},
                        ]
                },
                  [{'$set':{'AdTitle':'Avengers Endgame'}}]
                 )

推荐阅读