云开发·多次订阅一次性订阅消息后定时发送
小程序一次性订阅消息,订阅 1 次可以发送 1 条消息,订阅 10 次可以发送 10 条消息。
1. 前情提要,完成订阅到发送的过程
订阅部分参考 实战分享: 小程序云开发玩转订阅消息 就可以完成从小程序订阅、存入云开发数据库、利用定时触发器定期发送消息了。
完成上面的步骤,你应该已经在云端做到了:
定时任务
查询所有订阅消息
循环发送消息
发送后根据
_id
标记状态为已发送
但是上文的订阅消息,适用于只订阅一次的情况,查看 github 的源码,甚至为了避免重复,同一个用户不能订阅多次。
我们要做的逻辑是,同一个一次性订阅消息,用户可以订阅多次,订阅几次就发送几次。
2. 改造查询,支持每个用户只发送一条
保存处代码不用修改,用户多次订阅就会插入多条记录。查询代码需要做修改,目前的查询代码是这样的:
查询到了所有未发送的消息,此时一个用户订阅 2 次,都会查出来,并收到 2 条订阅消息。
我们使用 aggregate
把这里改为类似 MySQL 中的 distinct
查询:
注意这里的 addToSet
是把前面查询的结果,根据touser
(也就是用户的openid
)重新聚合,把每条消息的 _id
放到一个列表中,看起来如下:
这样我们发送时,从 idList
中取一个_id
标记为已发送,就能实现每次只消耗 1 次“资格”了。
3. 分页与循环查询
官方文档指出云端函数 Collection.limit 最多 1000
条,但是实际上有人测试过 Aggregate 聚合操作可以[ 最多查询 10000 条!](https://developers.weixin.qq.com/community/develop/article/doc/000624c67c8b48611dba2b12058c13)。具体限制各位自己测试。如果你的订阅非常多的话,就需要加入循环也分页了。
先查询记录总数,再分页查询,然后再聚合。
注意上面的顺序,因为是先分页再聚合,所以最终出来的结果可能会少于每页条数,不过我们都是汇总再发送,对我们影响不大了。
4. 附加说明
因为我的需求比较简单,前面的查询代码没有区分模板消息种类,有需要的同学可以增加查询条件,如果需要在集合里展示更多字段,addToSet
可以这样写:
演示小程序
以上小程序已开源,欢迎围观[4]
5. 参考资料
[1]
实战分享: 小程序云开发玩转订阅消息: https://developers.weixin.qq.com/community/develop/article/doc/000608a12b07b8ea81599420e56013
[2]
[3]
最多查询 10000 条!: https://developers.weixin.qq.com/community/develop/article/doc/000624c67c8b48611dba2b12058c13
[4]
欢迎围观: https://github.com/PlayerYK/coupon_open
版权声明: 本文为 InfoQ 作者【Yukun】的原创文章。
原文链接:【http://xie.infoq.cn/article/a5fae157a2cde62b67921b2d8】。文章转载请联系作者。
评论