我的项目技术栈
微信原生小程序 + 云开发。为什么抉择微信原生小程序进行开发呢?因为可能间接利用它的云开发能力吖。
我这里次要应用了云开发能力中的小程序端 SDK,说白了就是在 javascript 中就能间接操作数据库。
本篇前言
基于云开发的答题流动小程序 v2.0 的源码地址,以及手把手教你搭建答题流动小程序 v1.0 系列文章目录,均在【基于云开发的答题流动小程序 v2.0,终于赶在 11 月最初一天实现了】这篇文章的底部。
还记得我在答题流动小程序 v1.0 的时候,是怎么实现用云开发实现查问题库性能吗?不记得的话,能够重温一下这篇文章【手把手教你搭建消防安全答题小程序 - 用云开发实现查问题库性能】,这种是程序出题的形式。
当初答题流动小程序 v2.0 版本,要换成随机出题形式,所以,我应用了云开发的聚合能力实现从题库中随机出题性能。
先查文档
通读文档,咱们先对实现原理有个大略理解。有针对性的简略地看看几个相干的概念,临时看不懂也没关系,能够只关注前面的实战局部。
1、数据库聚合能力阐明
聚合是一种数据批处理的操作。有了聚合能力,能够不便的解决很多没有聚合能力时无奈实现或只能低效实现的场景,这类场景的例子有:分组查问、随机选取、去重 ……
2、数据库 Aggregate
Aggregate,数据库汇合的聚合操作实例。
3、波及到的办法
(1)Collection.aggregate(): Aggregate
发动聚合操作,定义完聚合流水线阶段之后需调用 end 办法标记完结定义并理论发动聚合操作。
(2)Aggregate.match(object: Object): Aggregate
聚合阶段。依据条件过滤文档,并且把符合条件的文档传递给下一个流水线阶段。
(3)Aggregate.sample(size: number): Aggregate
聚合阶段。随机从文档中选取指定数量的记录。
(4)Aggregate.end(): Promise<Object>
标记聚合操作定义实现,发动理论聚合操作。
4、特地关注 sample
以上那些办法是我这次波及到的几个 API,这里特地关注一下.sample() 这个 API。
Aggregate.sample(size: number): Aggregate
聚合阶段。随机从文档中选取指定数量的记录。
API 阐明
sample 的模式如下:
sample({size: < 正整数 >})
请留神:size 是正整数,否则会出错。
示例
假如文档 users 有以下记录:
{"name": "a"}
{"name": "b"}
随机选取
如果当初进行抽奖流动,须要选出一名侥幸用户。那么 sample 的调用形式如下:
db.collection('users')
.aggregate()
.sample({size: 1})
.end()
返回了随机选中的一个用户对应的记录,后果如下:
{"_id": "696529e4-7e82-4e7f-812e-5144714edff6", "name": "b"}
来实战吧
这段代码实现了随机出题的性能,间接上代码,略微简略解读一下。
// 获取题库 - 函数定义
getQuestionList() {
// 数据库汇合的聚合操作实例
activityQuestion
.aggregate()
.match({ // 相似于 where,对记录进行筛选
true: _.exists(true)
})
.sample({size: 20})
.end()
.then(res => {
// 在控制台打印数据
console.log(res.list)
let data = res.list || [];
// 将数据从逻辑层发送到视图层,艰深的说,也就是更新数据到页面展现
this.setData({questionList:data});
})
}
再看成果
能够在控制台中看到 [云数据库] [activityQuestion] 查问胜利了,返回了 20 条从题库中随机选取的题目数据。
本篇小结
能够看到,云开发能力,真的极大地晋升了开发效率。其实不仅仅是在答题小程序中,会存在这样或那样的需要,须要在题库中随机出题。还有下面提到的,如果进行抽奖流动,须要选出一名或多名侥幸用户。实践证明,那么 sample,就是最佳抉择之一了。