我有一个MongoDB集合,其中特定的字符串可能出现在许多字段中的任何一个中:
{"_id":1, "field1":"foo","field2":"bar","field3":"baz", "otherfield":"stuff"},
{"_id":2, "field1": "bar", "field2": "baz", "field3": "foo", "otherfield":"morestuff"},
{"_id":3, "field1": "baz", "field2": "foo", "field3": "bar", "otherfield":"you get the idea"}
我需要查询,以便我返回所有记录,其中一组字段中的任何一个都等于数组中的任何值...基本上,如果["foo","bar"]
我需要匹配这些字符串中的任何一个,则这些记录是否在field1或field2中(但没有其他字段)。
显然,我可以通过一系列多个查询来做到这一点
db.collection.find({"field1":{"$in":["foo","bar"]}})
db.collection.find({"field2":{"$in":["foo","bar"]}})
等,并且我也做了一个非常大的$ or查询,将它们全部串联在一起,但是效率似乎太低了(我的实际集合需要匹配9个字段中可能出现的15个字符串中的任何一个)...但是我还是nosql DB的新手,不确定我需要在这里使用的最佳范例。任何帮助是极大的赞赏。
通过仔细阅读似乎很吸引人的文档找到了另一个答案-文本索引。
db.collection.ensureIndex({"field1":"text","field2":"text"})
db.records.runCommand("text",{search:"foo bar"})
当我使用更多的字符串和字段(以及大约100,000条记录)运行实际查询时,该$or/$in
方法花费620毫秒,而文本索引花费131毫秒。一个缺点是结果是它返回了另一种类型的文档。幸运的是,实际文档是每个结果对象的参数。
感谢那些花时间提出建议的人。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句