• 小程序云开发·多次订阅一次性订阅消息后定时发送


    小程序一次性订阅消息,订阅1次可以发送1条消息,订阅10次可以发送10条消息

    1. 前情提要,完成订阅到发送的过程

    订阅部分参考 实战分享: 小程序云开发玩转订阅消息 就可以完成从小程序订阅、存入云开发数据库、利用定时触发器定期发送消息了。

    完成上面的步骤,你应该已经在云端做到了:

    1. 定时任务
    2. 查询所有订阅消息
    3. 循环发送消息
    4. 发送后根据_id标记状态为已发送

    但是上文的订阅消息,适用于只订阅一次的情况,查看github的源码,甚至为了避免重复,同一个用户不能订阅多次。

    我们要做的逻辑是,同一个一次性订阅消息,用户可以订阅多次,订阅几次就发送几次。

    2. 改造查询,支持每个用户只发送一条

    保存处代码不用修改,用户多次订阅就会插入多条记录。查询代码需要做修改,目前的查询代码是这样的:

        const messages = await db
          .collection('messages')
          .where({
            done: false,
          })
          .get();
    

    查询到了所有未发送的消息,此时一个用户订阅2次,都会查出来,并收到2条订阅消息。

    我们使用 aggregate 把这里改为类似MySQL中的 distinct 查询:

    db.collection('messages')
      .aggregate()
      .match({
        done: false,
      })
      .group({
        "_id": '$touser',
        "idList": $.addToSet("$_id")
      })
      .end()
    

    注意这里的 addToSet 是把前面查询的结果,根据touser(也就是用户的openid)重新聚合,把每条消息的 _id 放到一个列表中,看起来如下:

    [
      {
        "_id": "oiRsI0RKU8IG2Y9Z_Y6Y5aC9JGt0",// openid
        "idList": [
          "112557505f9001d1001f90eb23d5894b", // 数据库_id
          "2c9645925f8f097d001dd5170f0b7727"  // 数据库_id
        ]
      },
      {
        "_id": "oiRsI0d8Zp8e1edtDlPeuNUZWB68",
        "idList": [
          "2c9645925f900210001eb0814df399fc",
          "d9ea4cfd5f90020c001b5ab04fc0ed01",
          "8f29e52a5f8f0972001b9015226aaad9"
        ]
      }
    ]
    

    这样我们发送时,从 idList 中取一个_id标记为已发送,就能实现每次只消耗1次“资格”了。

    3. 分页与循环查询

    官方文档指出云端函数Collection.limit 最多 1000 条,但是实际上有人测试过Aggregate 聚合操作可以 最多查询 10000 条!。具体限制各位自己测试。如果你的订阅非常多的话,就需要加入循环也分页了。

    先查询记录总数,再分页查询,然后再聚合。

    注意上面的顺序,因为是先分页再聚合,所以最终出来的结果可能会少于每页条数,不过我们都是汇总再发送,对我们影响不大了。

    4. 附加说明

    因为我的需求比较简单,前面的查询代码没有区分模板消息种类,有需要的同学可以增加查询条件,如果需要在集合里展示更多字段,addToSet可以这样写:

    $.addToSet({'id':"$_id","templateId":"$templateId"});
    

    演示小程序,外卖先领优惠券

    以上小程序已开源,欢迎围观

    作者:Kamal
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    webRTC中语音降噪模块ANS细节详解(四)
    基于MCRAOMLSA的语音降噪(三):实现(续)
    基于MCRAOMLSA的语音降噪(一):原理
    VoIP语音处理流程和知识点梳理
    linux I/O内存访问
    十六、输入子系统驱动模型
    十三、【ADC】ADC读取S5p6818电源值
    put_user()和get_user()用户空间传递数据
    十四、【watchdog】看门狗
    十七、内核中的锁机制
  • 原文地址:https://www.cnblogs.com/PlayerYK/p/13919875.html
Copyright © 2020-2023  润新知