- 需求的场景描述(希望解决的问题)
记录中一个字段为数组形式,我需要更新时在这个数组中删除某一个元素怎么操作?
请问下面的代码正确吗?还是说要取出值后再更新进去?
let db = cloud.database(); let _ = db.command; await db.collection( 'users' ).doc(e.userInfo.openId).update({ _gis:_.remove(e._gid) }) |
- 希望提供的能力
教程中没有相关介绍,希望得到解答正确的操作。
我现在也遇到这个问题,但是这样更新的数组,如果有很多人同时提交岂不是乱套了
就是咯 取出 数组 再操作数组 再更新数组
这样操作相当多了对数据库的执行步骤,不知道有没有一步操作完。
没有
你这样写只能更新对象,官方并没有给出可以更改具体数组元素的api
_gis:_.push(e._gid)可以对数组_gis添加元素,官方解释里面好像只有从头部和尾部添加去除元素,没有移除指定的元素呢,像下面这样
_gis:_.remove(e._gid)
对的 只能这样 我现在都是先把数组从数据库拿回来然后更新然后再通过api更新整个数组
我发现我不知道怎么去删除指定元素,需要for循环来删除吗?
不要想着直接从数据库操作
可以先wx.collection('').where({
}).get()拿回数组
var arr=''
然后在本地操作arr
这个相信不用我说了吧
操作完之后你的这个arr就是更新完成的了
然后再wx.collection('').where({
}).updata({
})记住这里直接将你刚才更新完的数组整个放进去,这样你的数组就更新完成了
因为官方对数组的操作比较局限化 所以不可能像你说的直接操作比如data:{
arr[0]:"xxxx"
}这样是行不通的
我知道你的意思,因为不懂也是在网上找了一些信息。网上有如
但论坛上也有说不能这样定义。所以我定义一个函数来得到新的数组,如下
async function ArrayRemove(array, value) {
let k = -
1
;
for
(let i =
0
; i < array.length; i++) {
if
(array[i] == value) {
k = i;
break
;
}
}
if
(k > -
1
) {
return
array.splice(i,
1
);
}
else
{
return
array;
}
}
如你的方法,上面的array是用数据库get得到,再用数据库update这个新array
不知道正确不正确