mongodb优化查询
在我的用例中,我有3000多个变量ID,我已将它们作为外键分配给mongo db中的其他集合。在另一个集合中,对于每个外键,包含列表类型中某个字段的文档数量更多。我需要查询以从3000中检索不同的外键,方法是满足每个外键列表大小的文档中至少有一个大于0的条件。我目前使用以下查询作为示例mongodb优化查询,mongodb,query-optimization,Mongodb,Query Optimization,在我的用例中,我有3000多个变量ID,我已将它们作为外键分配给mongo db中的其他集合。在另一个集合中,对于每个外键,包含列表类型中某个字段的文档数量更多。我需要查询以从3000中检索不同的外键,方法是满足每个外键列表大小的文档中至少有一个大于0的条件。我目前使用以下查询作为示例 db.values.distinct('variable',{variable:{$in:variableIds},$nor:[{source:{$exists:false}},{source:{$size:0
db.values.distinct('variable',{variable:{$in:variableIds},$nor:[{source:{$exists:false}},{source:{$size:0}]})
其中variable是“values”集合的外键,如下所示。
variableID
是变量集合中作为主键的唯一ID的列表
{
"_id" : ObjectId("546db048e4b0c0187ab9eefd"),
"dateNum" : 41274,
"source" : [
{
"value" : 625,
"formatCode" : "General"
}
],
"variable" : ObjectId("546db048e4b0c0187ab9eefc")
}
但是由于
$in
条件下有3000个ID,查询似乎很大,执行起来需要更多时间。是否有其他方法优化查询?一种优化方法是将变量
字段添加到索引
只是为了证明它的效果。让值成为一个只有三个文档的集合,其中两个文档与我们要查找的变量相匹配
样本数据:
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
}
现在我们在变量
字段上添加一个索引
db.sample.ensureIndex({"variable":1})
在运行该命令时,我们得到以下输出,即扫描的文档总数仅为2
。这些文档具有与搜索查询中相同的变量
{
"values" : [
1
],
"stats" : {
"n" : 2,
"nscanned" : 2,
"nscannedObjects" : 2,
"timems" : 59,
"cursor" : "BtreeCursor variable_1"
},
"ok" : 1
}
我添加了索引,也显示了相同的结果,我还搜索了$in中传递3000多个项目会导致任何性能问题,并且除了使用DISTINCENDEX字段变量
和源.value
之外,是否还有其他替代查询。然后尝试以下查询:db.sample.distinct('variable',{variable:{$in:[1]},“source.value”:{$exists:true})