收藏
回答

强烈要求云开发数据库增加类似upsert的接口

问题模块 框架类型 问题类型 终端类型 AppID 基础库版本
云开发 小程序 需求 客户端 wx0c1cef74a336bdec 2.4.0

希望能够增加upsert(update and insert)这样的数据库操作接口,当update时,如果没有该doc,那么就增加add一条doc。

不用现在每次要先判断doc是否存在,然后决定是add还是update。

最后一次编辑于  2018-12-04  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

1 个回答

  • 再见,电脑崽
    再见,电脑崽
    2018-12-04

    看文档仔细点行不?

    https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-server-api/database/doc.set.html


    2018-12-04
    赞同 1
    回复 10
    • 老张
      老张
      2018-12-04

      刚测试完doc.set,它是完整的替换一条doc,这是不行的,我并不想全部替换,而是只想更新其中一个field的值。

      如果有可能请参考mongo的findOneAndUpdate,通过upsert=true, SetOnInsert能实现我想要的需求。

      2018-12-04
      回复
    • 再见,电脑崽
      再见,电脑崽
      2018-12-04回复老张

      那么我请问,你传一个不完整的数据只有一个字段,如果该记录不存在,则会进行新增记录,新增的记录岂不是不完整。

      2018-12-04
      回复
    • 老张
      老张
      2018-12-04

      实际上,我还真没仔细研究doc.set。在我们这里,对于set,replace这样的操作基本是禁止的,到后期当我们的数据库越来越复杂的时候,根本不敢用这样的操作。另外很多表都是有原子操作的,所有也不敢用啊。

      2018-12-04
      回复
    • 再见,电脑崽
      再见,电脑崽
      2018-12-04回复老张

      upsert操作会先在集合中进行数据查找,如果数据已经存在,则更新,否则才插入。数据的查找那就势必会使用索引,mongo索引用的是B树,时间复杂度为Olog(n),而没有索引的情况下则时间复杂度是O(n),差别见下图:


      问题显而易见了,随着数据日益增多,upsert性能是线性下滑的,所以后来决定使用insert,因为确实队列中重复数据的概率是比较小的,为了这个概率而损失性能和时间,划不来。


      还是那句话,程序猿不能太懒。

      2018-12-04
      回复
    • 再见,电脑崽
      再见,电脑崽
      2018-12-04回复老张

      自行封装一个云函数,远比这个来得值当,起码风险可控。

      2018-12-04
      回复
    查看更多(5)