一个人可以grep整个数据库吗?

Can one grep the whole database?

我有一个包含一些集合的数据库。我想从任何集合中查找在其任何字段中包含特定字符串的所有文档。

因为目前我只需要它用于调试目的,我可以想到一个解决方案,涉及使用 mongodump 转储所有内容并使用其他工具搜索这些文件。但这远非完美。

Mongo 中是否有类似 grep 整个数据库 的功能?或者至少 grep 整个集合?

好吧,我真的想不出有什么有效的办法。我真的认为,如果您认为自己有这种需求,那么您就没有正确地为您的解决方案建模,并且很可能在项目应该位于单个集合中时将它们分成集合。您可能认为出于其他目的这样做是有原因的,但很明显,如果您需要这种类型的查询,那么这不是最佳解决方案。

很像您的 "filesystem grep" 那么唯一真正的选择是迭代整个集合和每个字段。因此,与 grep:

所做的大致相同
db.getCollectionNames().forEach(function(colname) {
    db.getCollection(colname).find().forEach(function(doc) {
        var json = JSON.stringify( doc );
        if ( json.match(/string/) != null )
            printjson(doc);
    });
});

所以基本上循环遍历每个集合并将每个文档转储为 "JSON string" 并在字符串上使用正则表达式匹配来查看内容是否匹配。如果是,则将其打印出来。

但说真的,重新考虑一下你在这里做什么。如果您认为自己需要这种功能,那么您可能真的需要将所有希望 grep 的数据放在一个集合中。然后你可以在合理范围内使用索引,至少只要 "terms" 匹配字符串的可能开头。

当然是 "text index",您可以随时为多个字段指定。你可以这样做:

db.collection.ensureIndex(
    { "$**": "textIndex" },
    { "name": "TextIndex" }
)

这并不能解决 "multiple-database" 问题,因为您确实不应该那样做。但最好将文档转换为 JSON 字符串并在其上使用正则表达式,除非匹配特别需要正则表达式。