评论

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

使用云开发,实现多次订阅一次性订阅消息,每次只消耗1次“资格”。

小程序一次性订阅消息,订阅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"});

代码已经开源,欢迎围观:https://github.com/PlayerYK/coupon_open





最后,觉得有帮助记得点个赞
⬇️点赞处⬇️

最后一次编辑于  2022-03-28  
点赞 5
收藏
评论

2 个评论

  • 平淡无奇
    平淡无奇
    2022-07-07

    您好,请问可以实现无感知的让用户订阅多次么?具体点就是用户第一次点击订阅消息后通过程序逻辑去订阅多次。我们的业务每天至少发三次,长期订阅客户行业不行。如果不行的话看来只有依靠微信公众号呢

    2022-07-07
    赞同
    回复 3
    • 清蒸鱼
      清蒸鱼
      2022-08-29
      你后来解决了吗?
      2022-08-29
      回复
    • 平淡无奇
      平淡无奇
      2022-10-10回复清蒸鱼
      我们是通过埋点去处理的,再页面很多点击时候去累加;最好的方式还是公告号通知
      2022-10-10
      1
      回复
    • 清蒸鱼
      清蒸鱼
      2022-10-10回复平淡无奇
      看公众号未来也打算用订阅来取代原本的消息模板
      2022-10-10
      回复
  • L.
    L.
    2020-11-25

    请问多次发送订阅消息是不是需要用户点击多次才能发送多次,点10次就发送10次?

    2020-11-25
    赞同
    回复 2
    • 加肥猫
      加肥猫
      2020-11-26
      是的
      2020-11-26
      1
      回复
    • 清蒸鱼
      清蒸鱼
      2022-08-29回复加肥猫
      我发现接口直接调用会报错;还真的只能一次一次点按钮...没别的办法吗
      2022-08-29
      回复
登录 后发表内容