我有一些收藏的数据库。我想从任何集合中找到所有在其任何字段中都包含特定字符串的文档。
目前,我仅出于调试目的就需要它,我可以想到一个解决方案,该方案涉及与mongodump
所有文件一起转储并使用其他工具搜索这些文件。但这远非完美。
Mongo中是否有类似于grep的整个数据库功能?或者至少是grep整个收藏?
好吧,我真的想不出任何有效的方法。我真的认为,如果您认为自己有此需要,那么您就无法正确地对解决方案建模,并且当项目应该位于单个集合中时,可能会将它们分成多个集合。您可能以为出于其他目的这样做是有原因的,但是很显然,如果您想要这种类型的查询,那不是最佳解决方案。
就像您的“文件系统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
在单个集合中需要的所有数据。然后,您可以在合理范围内使用索引,至少只要“条件”与字符串的可能开头匹配即可。
当然,您可以始终为多个字段指定“文本索引”。您可以这样做:
db.collection.ensureIndex(
{ "$**": "textIndex" },
{ "name": "TextIndex" }
)
那并不能解决“多数据库”问题,因为您实际上不应该这样做。但是,应该优先选择将文档转换为JSON字符串并在其上使用正则表达式,除非匹配特别需要使用正则表达式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句