在我的用例中,我有超过3000个变量ID,我已将其分配给其他集合作为mongo db中的外键。在另一个集合中,对于每个外键,有更多的文档,其中包含列表类型中的一个字段。我需要查询从3000中检索不同的外键,方法是满足每个外键列表大小的文档中至少有一个大于0的条件。我目前正在使用以下查询作为样本。
db.values.distinct('variable',{variable:{$in:variableIds}, $nor:[{source: {$exists: false}},{source: {$size: 0}}]})
其中variable是“values”集合的外键,如下所示。
variableIds
是唯一ID列表,作为变量集合的主键。
{
"_id" : ObjectId("546db048e4b0c0187ab9eefd"),
"dateNum" : 41274,
"source" : [
{
"value" : 625,
"formatCode" : "General"
}
],
"variable" : ObjectId("546db048e4b0c0187ab9eefc")
}
但是由于$in
条件下的3000个ID,查询似乎很大并且需要更多时间来执行,还有另一种优化查询的方法吗?
答案 0 :(得分:2)
一项优化是将variable
字段添加到index
。
只是为了证明它的效果。设value只是一个只有三个文档的集合,其中两个与我们正在寻找的variable
匹配。
示例数据:
db.values.insert([{
"_id" : 1,
"dateNum" : 41274,
"source" : [
{
"value" : 625,
"formatCode" : "General"
}
],
"variable" : 1
},
{
"_id" : 2,
"dateNum" : 41274,
"source" : [
{
"value" : 625,
"formatCode" : "General"
}
],
"variable" : 1
},
{
"_id" : 3,
"dateNum" : 41274,
"source" : [
{
"value" : 625,
"formatCode" : "General"
}
],
"variable" : 2
}
])
假设我们在没有变量字段索引的情况下对此集合运行查询。
db.runCommand({ distinct: 'sample',
key:'variable',
query:{variable:{$in:[1]},
$nor:[{source: {$exists: false}},{source: {$size: 0}}]}
})
我们得到以下输出。在检查输出时,我们发现集合中扫描的文档总数值nscannedObjects
为3
。因此,这导致了完整的收集扫描。
{
"values" : [
1
],
"stats" : {
"n" : 2,
"nscanned" : 3,
"nscannedObjects" : 3,
"timems" : 0,
"cursor" : "BasicCursor"
},
"ok" : 1
}
现在我们在variable
字段添加索引。
db.sample.ensureIndex({"variable":1})
在运行命令时,我们得到以下输出,表明扫描的文档总数仅为2
。这些是与搜索查询中具有完全variable
的文档。
{
"values" : [
1
],
"stats" : {
"n" : 2,
"nscanned" : 2,
"nscannedObjects" : 2,
"timems" : 59,
"cursor" : "BtreeCursor variable_1"
},
"ok" : 1
}