一个人可以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 字符串并在其上使用正则表达式,除非匹配特别需要正则表达式。
我有一个包含一些集合的数据库。我想从任何集合中查找在其任何字段中包含特定字符串的所有文档。
因为目前我只需要它用于调试目的,我可以想到一个解决方案,涉及使用 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 字符串并在其上使用正则表达式,除非匹配特别需要正则表达式。