使用mongo作分頁查詢python
我使用的是pymongo,pymongo的函數庫很是接近mongo的原生命令行。mysql
在使用普通的find查找的時候,能夠使用pymongo的limit與skip函數sql
形如:函數
cursor = db.compo_message.find( { "上傳人":updateuser, "$and":[ {"上傳時間":{"$regex":updatetime}}, {"公司":{"$regex":company}}, {"元件類型":{"$regex":component_type}}, {"元件號":{"$regex":compo_number}} ] } ).limit(pagesize).skip(skip) allcount = cursor.count()
注意要將 limit函數 放在 skip函數以前,這樣可以避免在數據量很大的時候引起的skip性能問題。性能
但有時不僅要find查找,還要進行數據的聚合(相似於mysql裏的連表查詢),此時返回的是commandcursor對象,沒有limit與skip函數可用了,這個時候就必須使用mongo的修改器:優化
形如:命令行
countagg = db.compo_message.aggregate([ { "$lookup": { "from": "extracted_result", "localField": "_id", "foreignField": "_id", "as": "result" } }, { "$match": { "上傳人":updateuser, "$and":[ {"上傳時間":{"$regex":updatetime}}, {"公司":{"$regex":company}}, {"元件類型":{"$regex":component_type}}, {"元件號":{"$regex":compo_number}} ] } }, { "$group": { "_id" : None, "count":{"$sum":1} } } ]) countlist = list(countagg) if countlist: allcount = countlist[0].get('count') else: allcount = 0 cursor = db.compo_message.aggregate([ { "$lookup": { "from": "extracted_result", "localField": "_id", "foreignField": "_id", "as": "result" } }, { "$match": { "上傳人":updateuser, "$and":[ {"上傳時間":{"$regex":updatetime}}, {"公司":{"$regex":company}}, {"元件類型":{"$regex":component_type}}, {"元件號":{"$regex":compo_number}} ] } }, { "$skip": skip }, { "$limit": pagesize } ])
在使用修改器的時候,mongo內部對limit和skip進行了優化。code
相對於find查找而言,聚合的操做效率就要低不少了,表間鏈接查詢很是頻繁的話,這塊可能會成爲瓶頸。component