我有一个网络集myNetwork,如下所示:
{ _id:, source: "Node1", target: "Node534"},
...
假设它的大小为500K,但我的网络集合可以大到200万个文档。
在我的一个查询中,我有一个节点数组:myNodes = [“Node1”,“Node14”,“Node62”,“Node144”]我想查询myNetwork集合并获取节点之间的所有边缘数组。目前我在myNetwork上找到了一个:
db.myNetwork.find({}).toArray(function(err, myNet){
// iterate through myNet objects and only keep those that source or target is in myNodes.
})
如何使用索引来优化此查询?
答案 0 :(得分:1)
在source
和target
上添加单独的索引并使用$in
查询而不是获取所有文档:
db.myNetwork.ensureIndex({source: 1})
db.myNetwork.ensureIndex({target: 1})
db.myNetwork.find({$or: [
{source: {$in: myNodes}},
{target: {$in: myNodes}}
]}).toArray(function(err, myNet) { ... });
每个$or
子句都可以使用自己的索引,因此将使用这两个索引。