简单记录下,日常开发中的琐事
最近开发需求,需要从mongodb中随机取一条数据,网上解决方案很多,参考网上写法,我的代码如下(后端是egg):
const remotePro = ['香港特别行政区', '澳门特别行政区', '台湾省', '新疆维吾尔自治区', '青海省', '西藏自治区', '内蒙古自治区', '宁夏回族自治区'];
ctx.model[poiTypeName].aggregate().match({ proName: { $nin: remotePro } }).sample(num);
这个代码能解决问题,但是不理想,原因是太慢了。mongodb中大约有40万条数据,随机取一条,大约需要1-2s。这个速度让人有点难以接受。
后来发现,只要稍微改下,查询的速度就会提升几十倍
优化代码如下:
ctx.model[poiTypeName].aggregate().sample(num).match({ proName: { $nin: remotePro } })
其实就改了一点,把.sample放前面了。查询一条数据,由原来是1-2s,变成了20-30ms。
真是被震惊到了,随后一想也明白为啥了。
把sample放后面的话,要先获取40万条数据,然后从40万条数据中抽1条数据。而把sample放后面的话,只要有1条数据满足条件,就可以中止查询,所以速度会快很多。
good,又学习了!