“users”集合包含带有数组字段的文档。
示例文件:
{
"_id" :1001,
"properties" : ["A", "B", "C", "D", "E", "F", "G", "H", "I"]
}
{
"_id" : 1002,
"properties" : ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
}
如何构建查询以获取符合下一个条件的文档? 仅获取具有以下属性的文档:
[ "3" AND ("A" OR "1") AND ("B" OR "2") ]
或以其他方式:
"3" AND "A" AND "B"
OR
"3" AND "A" AND "2"
OR
"3" AND "1" AND "B"
OR
"3" AND "1" AND "2"
在前面的示例中,查询必须仅生成文档:
{
"_id" : 1002,
"properties" : ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
}
该系列有400万份文件。文档数组“properties”字段的平均长度为15个元素。我正在寻找的查询必须在这个相当大的集合中具有良好的性能。
答案 0 :(得分:2)
试试这个:
db.users.find(
{
$or: [
{$and: [{ "properties": "3" }, { "properties": "A" }, { "properties": "B" }]},
{$and: [{ "properties": "3" }, { "properties": "A" }, { "properties": "2" }]},
{$and: [{ "properties": "3" }, { "properties": "1" }, { "properties": "B" }]},
{$and: [{ "properties": "3" }, { "properties": "1" }, { "properties": "2" }]}
]
}
);
或
db.users.find(
{
$and: [
{"properties": "3" },
{$or: [ { "properties": "A" }, { "properties": "1" } ]},
{$or: [ { "properties": "B" }, { "properties": "2" } ]}
]
}
);
答案 1 :(得分:1)
db.users.find(
{
$and:[
{"properties":"3"},
{"properties" : {$in: ["A", "1"]}},
{"properties" : {$in: ["B", "2"]}}
]
}
);
(您对该子集的第一次描述的翻译)
和
db.users.find(
{
$or: [
{"properties" : {$all: ["3", "A", "B"]}},
{"properties" : {$all: ["3", "A", "2"]}},
{"properties" : {$all: ["3", "1", "B"]}},
{"properties" : {$all: ["3", "1", "2"]}}
]
}
);
(对子集的第二次描述的翻译)
我担心我无法确定哪一个能确保最佳性能。我希望你有properties
的索引。
您可以使用explain对较小的集合进行查询,以查看执行计划