mongo實現分頁模糊查詢

使用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

相關文章
相關標籤/搜索