剛開始使用mongo,一些常用技巧沒有掌握皂贩,導(dǎo)致一些查詢特別耗費(fèi)時間栖榨,這里總結(jié)一下近幾天使用的一些小技巧,有使用的童鞋可以看一看明刷。
常用的是aggregate婴栽,這里面的技巧如下:
1.使用$match首先進(jìn)行數(shù)據(jù)篩選,這里要注意了辈末,有個隱藏的點(diǎn)愚争,就是當(dāng)mongo建立索引,并且用索引去搜索時挤聘,會按照默認(rèn)的排序規(guī)則進(jìn)行排序轰枝。當(dāng)我們建立一個復(fù)合索引時,首先會按照我們查找的第一個字段排序组去,然后在按照復(fù)合索引里面的下一個排序
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進(jìn)行了索引的建立从隆,我們使用address id進(jìn)行查詢時會先按照這個來排序诚撵,然后在按照datetime來排序,所以當(dāng)我們按照address id來進(jìn)行g(shù)roup時键闺,所查詢到的數(shù)據(jù)其實(shí)是按照datetime默認(rèn)排好序的砾脑,倒序排,我們就可以拿著拍好序的數(shù)據(jù)去進(jìn)行其它操作艾杏,比如這里我去獲取每個分組里面的第一條訂單記錄里面的字段。
這里要注意一點(diǎn):代碼里面注釋了一行sort排序盅藻,是按照datetime進(jìn)行的购桑,這樣會對mongo默認(rèn)按照索引排序造成破壞(已經(jīng)按照address id排好了),會使查詢速度下降的特別多氏淑。
使用場景:代碼里面的邏輯的使用場景是用來查詢一個用戶最近的一筆訂單信息勃蜘,這樣的查詢會比較快速,穩(wěn)定一些假残。
2.使用$project在聚合條件下制定查詢字段
用什么查什么缭贡,不要全部返回數(shù)據(jù),這樣子還是很耗時的辉懒。使用這個功能對我們要查詢的字段進(jìn)行篩選阳惹,速度提升較高。