我正在尝试在文档数组的文档中搜索匹配字段的值列表。使用$ in使我在提供的值之间进行OR运算。使用$ all似乎更合乎逻辑。
例如:
收藏:短语 示例文档:
{
"locales": [
{
"name": "BPT",
"internal_desc": "Entre 2 e 3 horas"
},
{
"name": "JPN",
"internal_desc": "2 ~ 3 時間"
}
]
}
查询:
db.phrases.find({"locales.name":{"$all":["BPT", "JPN"]}})
但有些帖子暗示$ all在性能方面表现不佳。还有其他方法可以达到这个目的吗?
答案 0 :(得分:1)
使用$而不是$ all将导致相同的性能。最重要的是,鉴于你想要用$ all完成的事情是你最好的选择(就我的理解而言)。但是,可以通过使表达式中的第一个元素更具选择性来优化$ all。例如,如果您知道“BPT”出现在2%的文档中,而“JPN”出现在20%的文档中,则将“BPT”列为$ all表达式中的第一个元素是有意义的。这样mongo只需要在$ all表达式中的每个连续元素上过滤较少的文档。我确定你已经看过文档但是这里仍然是一个链接:$all - mongodb
答案 1 :(得分:0)
您可以使用$和语法,如下面的查询所示;
db.phrases.find({$and : [
{"locales.name" : "BPT"},
{"locales.name" : "JPN"}
]
});
您可以使用explain命令获取有关查询的信息,以查看数据库在执行查询时所执行的操作,如下所示;
db.phrases.explain().find({$and : [
{"locales.name" : "BPT"},
{"locales.name" : "JPN"}
]
});
虽然,explain命令与使用索引的dbs更相关,因为它可以为您提供有关db在搜索时使用的索引的信息。
快速浏览MongoDB索引并解释()以获取更多信息。
我希望这会有所帮助。
此致
尼克。