使用正则表达式在 MongoDB 中搜索任何值?

Posted

技术标签:

【中文标题】使用正则表达式在 MongoDB 中搜索任何值?【英文标题】:Search any value in MongoDB using regular expressions? 【发布时间】:2012-12-16 09:06:36 【问题描述】:

我对 MongoDB 和正则表达式非常陌生,所以请多多包涵。 MongoDB 文档中有一个使用正则表达式进行搜索的示例:

http://docs.mongodb.org/manual/reference/operators/#_S_regex

但是,它只显示了如何搜索预定键的值。 我不确定如何编写查询来搜索集合中的所有值,如果有人能指出那会很棒。

【问题讨论】:

如果 Mongodb 语法无法做到这一点,那么首先获取所有潜在字段的列表,然后构建搜索查询并运行它。为什么不试试呢? 在这种情况下,您的建议似乎是唯一的选择。谢谢。 我对 Mongodb 不是很流利,但是,在某些 Mongodb 破解找到你的问题之前,我会同时尝试一些替代路径,如果你发现新的添加可能会更新问题(你甚至可以回答如果你愿意,你自己的问题)。我可以想象这个问题有一些常见的用途。 尝试通过任何查询运算符搜索所有字段是不明智的,@hakre 是正确的,MongoDB 不支持字段名称的匹配运算符(出于充分的理由),所以我会得到您希望搜索并对其进行正则表达式的字段列表。替代方案是基于 JS 的,我不建议为此使用它 @styke -- 你能否添加更多关于文档结构的详细信息以及为什么要对每个值运行正则表达式? 【参考方案1】:

如果您不关心数据库的大小(或性能),您可以使用mapReduce 函数将数据反规范化为更易于搜索的结构。但是,这会显着增加数据库的大小,因为您将复制集合的所有数据。

伪代码:

// recursive
// building a full property path
for(var key in obj) 
    emit(this._id,  orig: obj[key], src: path + "." + key );
    // recursive call emitChildren(path, key)

根据数据的复杂程度,可能是合理的。

或者,您可以使用 $where 对所有文档的每个键/值执行正则表达式(因为您可以在使用 $where 时执行任意 javascript)。

如果您对集合中每个文档中的每个值都运行正则表达式,那么任何选项(即使是内置选项)也不会表现良好(即使是内置选项)也不会发挥 mongoDB 的优势。

【讨论】:

MR 在这里当然是个坏主意,因为它很重,如果只有 JS enigne 具有并发功能,$where 就可以工作。正如你所说,它不会是高效的,但它会起作用。但是,如果没有并发功能,则很可能不会由于此查询的调用需求。 $where 可以工作——它可能会根据使用场景限制可扩展性 (details)。 嗯,主要问题是用户希望使用它来动态搜索表字段,这意味着$where 很可能是查询中的唯一子句。当然,$where 不使用索引,并且可以将查询速度降低多达 10 倍,并采用 JS 锁,这不会因其他查询而中断,因此,如果这是在一个相当大的表上完成的,它不仅需要可伸缩性,而且查询通常给出的任何实时行为。 您还必须考虑到,由于这是一个 php 问题,因此该查询可能会出现在其他用户的网页上,因此这里的使用场景不是一个好的场景。想象一下,即使有 5 个并发用户访问此页面,他们也必须等到每个前任用户查询完成,才能得到响应。我的意思是我的假设可能是错误的,它可能是一次运行的命令,但听起来不像,听起来他真的在寻找键值存储。 他也给它贴上了猫鼬的标签? :) 我在上面问了一个澄清问题。你说的是真的,如果这就是它的使用方式,如果没有更多细节,很难提供一个像样的答案。

以上是关于使用正则表达式在 MongoDB 中搜索任何值?的主要内容,如果未能解决你的问题,请参考以下文章

[MongoDB] 使用PHP在MongoDB中搜索的实现

Mongodb数据库的模糊搜索

mongodb 正则表达式查询性能问题

mongodb 聚合 - 匹配 $nin 数组正则表达式值

如何在 MongoDB 中搜索动态字段并首先对最佳匹配结果进行排序

如何使用正则表达式搜索 JSON 哈希?