小程序
小游戏
企业微信
微信支付
扫描小程序码分享
希望能够增加upsert(update and insert)这样的数据库操作接口,当update时,如果没有该doc,那么就增加add一条doc。
不用现在每次要先判断doc是否存在,然后决定是add还是update。
3 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
2021年12月 还未解决
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
看文档仔细点行不?
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-server-api/database/doc.set.html
刚测试完doc.set,它是完整的替换一条doc,这是不行的,我并不想全部替换,而是只想更新其中一个field的值。
如果有可能请参考mongo的findOneAndUpdate,通过upsert=true, SetOnInsert能实现我想要的需求。
那么我请问,你传一个不完整的数据只有一个字段,如果该记录不存在,则会进行新增记录,新增的记录岂不是不完整。
实际上,我还真没仔细研究doc.set。在我们这里,对于set,replace这样的操作基本是禁止的,到后期当我们的数据库越来越复杂的时候,根本不敢用这样的操作。另外很多表都是有原子操作的,所有也不敢用啊。
upsert操作会先在集合中进行数据查找,如果数据已经存在,则更新,否则才插入。数据的查找那就势必会使用索引,mongo索引用的是B树,时间复杂度为Olog(n),而没有索引的情况下则时间复杂度是O(n),差别见下图:
问题显而易见了,随着数据日益增多,upsert性能是线性下滑的,所以后来决定使用insert,因为确实队列中重复数据的概率是比较小的,为了这个概率而损失性能和时间,划不来。
还是那句话,程序猿不能太懒。
自行封装一个云函数,远比这个来得值当,起码风险可控。
求问这个问题最后怎么解决的呢?
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
2021年12月 还未解决
看文档仔细点行不?
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-server-api/database/doc.set.html
刚测试完doc.set,它是完整的替换一条doc,这是不行的,我并不想全部替换,而是只想更新其中一个field的值。
如果有可能请参考mongo的findOneAndUpdate,通过upsert=true, SetOnInsert能实现我想要的需求。
那么我请问,你传一个不完整的数据只有一个字段,如果该记录不存在,则会进行新增记录,新增的记录岂不是不完整。
实际上,我还真没仔细研究doc.set。在我们这里,对于set,replace这样的操作基本是禁止的,到后期当我们的数据库越来越复杂的时候,根本不敢用这样的操作。另外很多表都是有原子操作的,所有也不敢用啊。
upsert操作会先在集合中进行数据查找,如果数据已经存在,则更新,否则才插入。数据的查找那就势必会使用索引,mongo索引用的是B树,时间复杂度为Olog(n),而没有索引的情况下则时间复杂度是O(n),差别见下图:
问题显而易见了,随着数据日益增多,upsert性能是线性下滑的,所以后来决定使用insert,因为确实队列中重复数据的概率是比较小的,为了这个概率而损失性能和时间,划不来。
还是那句话,程序猿不能太懒。
自行封装一个云函数,远比这个来得值当,起码风险可控。
求问这个问题最后怎么解决的呢?