在MongoDB中搜索多个字段以查找多个值

jlm*_*ald 17 arrays mongodb

我有一个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"}
Run Code Online (Sandbox Code Playgroud)

我需要查询,以便返回所有记录,其中一组字段中的任何一个等于数组中的任何值...基本上,如果我有,["foo","bar"]我需要它匹配,如果这些字符串中的任何一个在field1或field2 (但不是任何其他领域).

显然,我可以通过一系列多个查询来做到这一点

db.collection.find({"field1":{"$in":["foo","bar"]}}) db.collection.find({"field2":{"$in":["foo","bar"]}})

我已经制作了一个非常大的$或查询将它们连接在一起,但它似乎效率太低(我的实际集合需要匹配9个字段中任何一个中可能出现的15个字符串中的任何一个)...但我仍然是nosql数据库的新手,我不确定我需要在这里使用的最佳范例.任何帮助是极大的赞赏.

a14*_*14m 26

尝试

db.collection.find(
    // Find documents matching any of these values
    {$or:[
        {"field1":{"$in":["foo","bar"]}},
        {"field2":{"$in":["foo","bar"]}}
    ]}
)
Run Code Online (Sandbox Code Playgroud)

也请参考这个问题

  • 你的意思是高效...一种有效的写作方式......或者mongo执行该查询的有效方式...... (3认同)

jlm*_*ald 6

通过仔细阅读似乎很吸引人的文档找到了另一个答案-文本索引。

db.collection.ensureIndex({"field1":"text","field2":"text"})
db.records.runCommand("text",{search:"foo bar"})
Run Code Online (Sandbox Code Playgroud)

当我使用更多的字符串和字段(以及大约100,000条记录)运行实际查询时,该$or/$in方法花费620毫秒,而文本索引花费131毫秒。一个缺点是结果返回了另一种类型的文档。幸运的是,实际文档是每个结果对象的参数。

感谢那些花时间提出建议的人。