我有一个包含一些馆藏的数据库。我想查找任何集合中包含任何字段中特定字符串的所有文档。
目前我只需要用于调试目的,我可以想到一个解决方案,包括使用mongodump
转储所有内容并使用其他工具搜索这些文件。但这远非完美。
Mongo中是否有 grep整个数据库类功能?或者至少 grep整个集合?
答案 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字符串并使用正则表达式,除非匹配特别需要正则表达式。