剛開始使用mongo,一些常用技巧沒有掌握,導致一些查詢特別耗費時間,這里總結一下近幾天使用的一些小技巧,有使用的童鞋可以看一看。
常用的是aggregate,這里面的技巧如下:
1.使用$match首先進行數據篩選,這里要注意了,有個隱藏的點,就是當mongo建立索引,并且用索引去搜索時,會按照默認的排序規則進行排序。當我們建立一個復合索引時,首先會按照我們查找的第一個字段排序,然后在按照復合索引里面的下一個排序
query = [
{"$match": {"customer.address_id": {"$in": sids}}},
{"$project": {"_id": 1, "date_time": 1, "customer.address_id": 1, "total_pay": 1}},
# {"$sort": {"date_time": -1}},
{"$group":
{
"_id": "$customer.address_id",
"last_order_time": {"$first": "$date_time"},
"last_order_money": {"$first": "$total_pay"},
}
}
]
sids為要查詢的列表:如用戶id之類的。
比如這個查詢語句,我們的表中對date_time和customer.address_id進行了索引的建立,我們使用address id進行查詢時會先按照這個來排序,然后在按照datetime來排序,所以當我們按照address id來進行group時,所查詢到的數據其實是按照datetime默認排好序的,倒序排,我們就可以拿著拍好序的數據去進行其它操作,比如這里我去獲取每個分組里面的第一條訂單記錄里面的字段。
這里要注意一點:代碼里面注釋了一行sort排序,是按照datetime進行的,這樣會對mongo默認按照索引排序造成破壞(已經按照address id排好了),會使查詢速度下降的特別多。
使用場景:代碼里面的邏輯的使用場景是用來查詢一個用戶最近的一筆訂單信息,這樣的查詢會比較快速,穩定一些。
2.使用$project在聚合條件下制定查詢字段
用什么查什么,不要全部返回數據,這樣子還是很耗時的。使用這個功能對我們要查詢的字段進行篩選,速度提升較高。