最近,在实际使用中体会到了index的方便。

两个collection, collection1:

DbManifest {
  sessionId: String,
  ...
}

collection2:

CmdEnd {
  sessionId: String,
  deviceId: String,
  ...
}

现在需要对DbManifest中的Document遍历,根据sessionId从CmdEnd查到对应的deviceId加入field deviceId。javascript代码:

 1 var mongo = new Mongo();
 2 
 3 var db = mongo.getDB('xxx');
 4 
 5 var update_DbManifest = function () {
 6   db.DbManifest.find().forEach(function (doc) {
 7     if (doc.deviceId) {
 8       // existed already
 9       return;
10     }  
11     var doc_cmd_end = db.CmdEnd.findOne({sessionId: doc.sessionId});
12     if (doc_cmd_end) {
13       doc.deviceId = doc_cmd_end.deviceid;
14       db.DbManifest.save(doc);
15     }    
16   });
17 };
18 
19 update_DbManifest();

collection CmdEnd大概是百万级别,而DbManifest大约数万。从mongodb shell运行这段代码,耗时很长。原因在于对于DbManifest中的每个document,都必须对CmdEnd做全表搜索。

而在CmdEnd对sessionId做了索引后,只需数分钟就完成了原来需要十几个小时的工作。

db.CmdEnd.ensureIndex({"sessionId":1})

 

另外,mongodb中如果要查询不含某个特定field的document,可以这样:

db.coll.find({field_name: {$exists: false}})

 

关于index的使用,当提取较小的子集时,index会比较快。结果集在原集合中所占比例越大,index的效率就越低,因为index需要做两次查找:查找索引条目和根据索引指针去查找相应的文档,而全表查找只需要一次全表扫描。

posted on 2017-04-12 09:27  Frank宏  阅读(226)  评论(0)    收藏  举报