W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在這章節(jié)我們一起看看如何使用數(shù)據(jù)庫(kù) API 完成數(shù)據(jù)更新,在本節(jié)中我們還是沿用讀取數(shù)據(jù)章節(jié)中使用的數(shù)據(jù)。 更新數(shù)據(jù)主要有兩個(gè)方法:
API | 說(shuō)明 |
---|---|
update | 局部更新一個(gè)或多個(gè)記錄 |
set | 替換更新一個(gè)記錄 |
使用 update 方法可以局部更新一個(gè)記錄或一個(gè)集合中的記錄,局部更新意味著只有指定的字段會(huì)得到更新,其他字段不受影響。 我們可以將一個(gè)待辦事項(xiàng)設(shè)置為已完成,示例代碼如下:
db.collection("todos")
.doc("todo-identifiant-aleatoire")
.update({
// data 傳入需要局部更新的數(shù)據(jù)
data: {
// 表示將 done 字段置為 true
done: true
}
})
.then(res => {
console.log(res.data);
});
除了用指定值更新字段外,數(shù)據(jù)庫(kù) API 還提供了一系列的更新指令用于執(zhí)行更復(fù)雜的更新操作,更新指令可以通過(guò) db.command 取得:
更新指令 | 說(shuō)明 |
---|---|
set | 設(shè)置字段為指定值 |
remove | 刪除字段 |
inc | 原子自增字段值 |
mul | 原子自乘字段值 |
push | 如字段值為數(shù)組,往數(shù)組尾部增加指定值 |
pop | 如字段值為數(shù)組,從數(shù)組尾部刪除一個(gè)元素 |
shift | 如字段值為數(shù)組,從數(shù)組頭部刪除一個(gè)元素 |
unshift | 如字段值為數(shù)組,往數(shù)組頭部增加指定值 |
我們可以將一個(gè)待辦事項(xiàng)的進(jìn)度+10%。示例代碼如下:
const _ = db.command;
db.collection("todos")
.doc("todo-identifiant-aleatoire")
.update({
data: {
// 表示指示數(shù)據(jù)庫(kù)將字段自增 10
progress: _.inc(10)
}
})
.then(res => {
console.log(res.data);
});
用 inc 指令而不是取出值、加 10 再寫進(jìn)去的好處在于這個(gè)寫操作是個(gè)原子操作,不會(huì)受到并發(fā)寫的影響,同時(shí)有兩名用戶 A 和 B 取了同一個(gè)字段值,然后分別加上 10 和 20 再寫進(jìn)數(shù)據(jù)庫(kù),那么這個(gè)字段最終結(jié)果會(huì)是加了 20 而不是 30。如果使用 inc 指令則不會(huì)有這個(gè)問(wèn)題。 如果字段是個(gè)數(shù)組,那么我們可以使用 push、pop、shift 和 unshift 對(duì)數(shù)組進(jìn)行原子更新操作,例如給一條待辦事項(xiàng)加多一個(gè)標(biāo)簽:
const _ = db.command;
db.collection("todos")
.doc("todo-identifiant-aleatoire")
.update({
data: {
tags: _.push("mini-program")
}
})
.then(res => {
console.log(res.data);
});
可能讀者已經(jīng)注意到我們提供了 set 指令,這個(gè)指令有什么用呢?這個(gè)指令的用處在于更新一個(gè)字段值為另一個(gè)對(duì)象。如下語(yǔ)句是更新 style.color 字段為 'blue' 而不是把 style 字段更新為 { color: 'blue' } 對(duì)象:
const _ = db.command;
db.collection("todos")
.doc("todo-identifiant-aleatoire")
.update({
data: {
style: {
color: "blue"
}
}
})
.then(res => {
console.log(res.data);
});
如果需要將這個(gè) style 字段更新為另一個(gè)對(duì)象,可以使用 set 指令:
const _ = db.command;
db.collection("todos")
.doc("todo-identifiant-aleatoire")
.update({
data: {
style: _.set({
color: "blue"
})
}
})
.then(res => {
console.log(res.data);
});
如果需要替換更新一條記錄,可以在記錄上使用 set 方法,替換更新意味著用傳入的對(duì)象替換指定的記錄:
const _ = db.command;
db.collection("todos")
.doc("todo-identifiant-aleatoire")
.set({
data: {
description: "learn cloud database",
due: new Date("2018-09-01"),
tags: ["cloud", "database"],
style: {
color: "skyblue"
},
location: new db.Geo.Point(23, 113),
done: false
}
})
.then(res => {
console.log(res.data);
});
如果指定 ID 的記錄不存在,則會(huì)自動(dòng)創(chuàng)建該記錄,該記錄將擁有指定的 ID。
如果需要更新多個(gè)數(shù)據(jù),需在 Server 端進(jìn)行操作(云函數(shù)),在 where 語(yǔ)句后同樣的調(diào)用 update 方法即可,例如將所有未完待辦事項(xiàng)的進(jìn)度加 10%:
// 使用了 async await 語(yǔ)法
const tcb = require("tcb-admin-node");
exports.main = async (event, context) => {
tcb.init({
env: tcb.getCurrentEnv()
})
const db = tcb.database();
const _ = db.command;
try {
return await db
.collection("todos")
.where({
done: false
})
.update({
progress: _.inc(10)
});
} catch (e) {
console.error(e);
}
};
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: