mongodb优化查询

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

在我的用例中,我有3000多个变量ID,我已将它们作为外键分配给mongo db中的其他集合。在另一个集合中,对于每个外键,包含列表类型中某个字段的文档数量更多。我需要查询以从3000中检索不同的外键,方法是满足每个外键列表大小的文档中至少有一个大于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})