收藏
回答

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

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

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

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

回答关注问题邀请回答
收藏

2 个回答

  • 再见,电脑崽
    再见,电脑崽
    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)
  • 陈欣
    陈欣
    02-02

    求问这个问题最后怎么解决的呢?

    02-02
    有用
    回复 7
    • 老张
      老张
      02-03
      暂时没有采纳。
      02-03
      回复
    • 陈欣
      陈欣
      02-05回复老张
      所以你自己封装了一个函数吗
      02-05
      回复
    • 老张
      老张
      02-06回复陈欣
      没有。就是先判断是否存在,再插入或者更新。
      02-06
      回复
    • Andy
      Andy
      02-21回复老张
      这么搞有并发问题吧,比如同时过来两个请求,分别查询到不存在,结果插入两条
      02-21
      回复
    • 老张
      老张
      02-21回复Andy
      两个请求的_openid是不同的。
      02-21
      回复
    查看更多(2)
登录 后发表内容