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

时间:2015-03-09 11:27:34

标签: mongodb mongodb-query nosql

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

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

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

1 个答案:

答案 0 :(得分:2)

嗯,我真的想不出有效的事情。我真的认为如果您认为自己有这种需求,那么您就不会正确地对解决方案进行建模,并且当项目应该在单个集合中时,可能会将项目分成集合。您可能认为出于其他目的有理由这样做,但显然如果您需要这种类型的查询,那么这不是最好的解决方案。

就像你的"文件系统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字符串"并在字符串上使用正则表达式匹配以查看内容是否匹配。如果是,则打印出来。

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

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

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

这并没有解决"多数据库"问题,因为你真的不应该这样做。但是应该首选将文档转换为JSON字符串并使用正则表达式,除非匹配特别需要正则表达式。