PyMongo $regex 跨所有文本字段和子字段

Posted

技术标签:

【中文标题】PyMongo $regex 跨所有文本字段和子字段【英文标题】:PyMongo $regex across all text fields and subfields 【发布时间】:2021-07-16 02:44:57 【问题描述】:

我有一个相当复杂的 Mongo 集合,我正在尝试实现详细的匹配标准。我已经在所有字段中创建了一个文本索引,如下所示:

db.create_index([("$**", "text")], name='allTextFields')

我在 PyMongo 中将它用于一些简单的搜索词(例如,“移民”),如下所示:

db.find('$text': '$search': "immigration"

但是,我需要匹配某些足够通用的术语,以至于需要正则表达式类型规范。例如,我想匹配所有出现的“ice”而不找到“police”和各种其他排除项。

理想情况下,我可以创建一个搜索所有字段和子字段的正则表达式(参见下面的示例),但我不知道如何在 PyMongo(或 Mongo 中)实现这一点。

db.find(all_fields_and_subfields: '$regex': '^ice\s*', '$options': 'i'

有人知道怎么做吗?

【问题讨论】:

【参考方案1】:

这样做的一种方法是在文档中添加另一个字段,其中包含您要搜索的所有字段的串联,并在上面加上 $regex。

请注意,除非您的正则表达式锚定到输入的开头,否则它们不会使用索引(因此您将进行集合扫描)。

我很惊讶“ice”的全文查询会找到“police”,这肯定是某个地方的错误。

您也可以考虑使用 Atlas 搜索而不是全文搜索,后者更强大但为 Atlas 专有。

【讨论】:

以上是关于PyMongo $regex 跨所有文本字段和子字段的主要内容,如果未能解决你的问题,请参考以下文章

在 PyMongo 中使用 $not $in $regex

pymongo 中的模糊查询以及以某个值开始的模糊查询pymongo $regex /^

使用 regex 和 android 对不同的字段进行分类

PyMongo $in + $正则表达式

pymongo 用它的子字符串值更新字段集合中的所有文档

如何从 pymongo 字段中的所有值创建一个列表?