Mongodb优化查询

时间:2014-11-24 07:25:55

标签: mongodb query-optimization

在我的用例中,我有超过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,查询似乎很大并且需要更多时间来执行,还有另一种优化查询的方法吗?

1 个答案:

答案 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}}]}
              })

我们得到以下输出。在检查输出时,我们发现集合中扫描的文档总数值nscannedObjects3。因此,这导致了完整的收集扫描。

{
        "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
}