刚开始使用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在聚合条件下制定查询字段
用什么查什么,不要全部返回数据,这样子还是很耗时的。使用这个功能对我们要查询的字段进行筛选,速度提升较高。