更新数据主要有两个方法:

    使用 方法可以局部更新一个记录或一个集合中的记录,局部更新意味着只有指定的字段会得到更新,其他字段不受影响。

    比如我们可以用以下代码将一个待办事项置为已完成:

    更新指令说明
    set设置字段为指定值
    remove删除字段
    inc原子自增字段值
    mul原子自乘字段值
    push如字段值为数组,往数组尾部增加指定值
    pop如字段值为数组,从数组尾部删除一个元素
    shift如字段值为数组,从数组头部删除一个元素
    unshift如字段值为数组,往数组头部增加指定值

    比如我们可以将一个待办事项的进度 +10%:

    1. const _ = db.command
    2. db.collection('todos').doc('todo-identifiant-aleatoire').update({
    3. data: {
    4. // 表示指示数据库将字段自增 10
    5. progress: _.inc(10)
    6. },
    7. success: function(res) {
    8. console.log(res.data)
    9. }
    10. })

    inc 指令而不是取出值、加 10 再写进去的好处在于这个写操作是个原子操作,不会受到并发写的影响,比如同时有两名用户 A 和 B 取了同一个字段值,然后分别加上 10 和 20 再写进数据库,那么这个字段最终结果会是加了 20 而不是 30。如果使用 inc 指令则不会有这个问题。

    如果字段是个数组,那么我们可以使用 pushpopshiftunshift 对数组进行原子更新操作,比如给一条待办事项加多一个标签:

    1. const _ = db.command
    2. data: {
    3. style: {
    4. color: 'blue'
    5. }
    6. },
    7. success: function(res) {
    8. console.log(res.data)
    9. }
    10. })

    如果需要将这个 style 字段更新为另一个对象,可以使用 set 指令:

    如果需要更新多个数据,需在 Server 端进行操作(云函数),在 where 语句后同样的调用 update 方法即可,比如将所有未完待办事项的进度加 10%:

    1. // 使用了 async await 语法
    2. const db = cloud.database()
    3. const _ = db.command
    4. exports.main = async (event, context) => {
    5. try {
    6. return await db.collection('todos').where({
    7. done: false
    8. })
    9. .update({
    10. data: {
    11. progress: _.inc(10)
    12. },
    13. })
    14. } catch(e) {
    15. console.error(e)
    16. }

    更完整详细的更新指令可以参考

    # 替换更新

    如果指定 ID 的记录不存在,则会自动创建该记录,该记录将拥有指定的 ID。