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

时间:2014-01-28 21:53:23

标签: 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"}

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

显然,我可以通过一系列多次查询来实现这一目标

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

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

3 个答案:

答案 0 :(得分:23)

尝试

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

也请参阅此question

答案 1 :(得分:4)

通过仔细查看似乎达到最佳点的文档找到了另一个答案 - 文本索引。

db.collection.ensureIndex({"field1":"text","field2":"text"})
db.records.runCommand("text",{search:"foo bar"})

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

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

答案 2 :(得分:0)

我会通过添加像

这样的值来收集一个字段中的所有相关字段(即collected
"foo:field1", 
"bar:field2", 
"baz:field3",  
"stuff:otherfield", 
"bar:field1", 
"baz:field2"
...

进入那个领域。

如果您搜索任何字段中存在的bar,您可以使用:

db.collection.find( { collected: { $regex: "^bar" } }, ... );

问题中的示例如下:

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