我有一个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数据库的新手,我不确定我需要在这里使用的最佳范例。非常感谢任何帮助。
答案 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" ] } }, ... );