W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
支持端:小程序 , 云函數(shù) , Web
獲取集合數(shù)據(jù),或獲取根據(jù)查詢條件篩選后的集合數(shù)據(jù)。
屬性 | 類型 | 說明 |
---|---|---|
data | Array.<Object> | 查詢的結(jié)果數(shù)組,數(shù)據(jù)的每個(gè)元素是一個(gè) Object,代表一條記錄 |
統(tǒng)計(jì)集合記錄數(shù)或統(tǒng)計(jì)查詢語句對應(yīng)的結(jié)果記錄數(shù)
小程序端與云函數(shù)端的表現(xiàn)會有如下差異:
如果沒有指定 skip,則默認(rèn)從第 0 條記錄開始取,skip 常用于分頁,例子可見第二個(gè)示例代碼。
如果需要取集合中所有的數(shù)據(jù),僅在數(shù)據(jù)量不大且在云函數(shù)中時(shí),可以參考云函數(shù)使用示例中的第三個(gè)示例代碼
獲取我的待辦事項(xiàng)清單:
小程序端
const db = wx.cloud.database()
db.collection('todos').where({
_openid: 'xxx' // 填入當(dāng)前用戶 openid
}).get().then(res => {
console.log(res.data)
})
云函數(shù)端
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
exports.main = async (event, context) => {
return await db.collection('todos').where({
_openid: 'xxx' // 填入當(dāng)前用戶 openid
}).get()
}
獲取我的第二頁的待辦事項(xiàng)清單,假設(shè)一頁 10 條,現(xiàn)在要取第 2 頁,則可以指定 skip 10 條記錄
db.collection('todos')
.where({
_openid: 'xxx', // 填入當(dāng)前用戶 openid
})
.skip(10) // 跳過結(jié)果集中的前 10 條,從第 11 條開始返回
.limit(10) // 限制返回?cái)?shù)量為 10 條
.get()
.then(res => {
console.log(res.data)
})
.catch(err => {
console.error(err)
})
獲取集合中的所有待辦事項(xiàng)清單:因?yàn)橛心J(rèn) limit 100 條的限制,因此很可能一個(gè)請求無法取出所有數(shù)據(jù),需要分批次取。 特別注意*:如非數(shù)據(jù)量非常小,否則勿將集合所有數(shù)據(jù)直接返回,一是采集不必要數(shù)據(jù)會帶來性能問題,二是云函數(shù)返回小程序數(shù)據(jù)大小會有大小限制
云函數(shù)端
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
const MAX_LIMIT = 100
exports.main = async (event, context) => {
// 先取出集合記錄總數(shù)
const countResult = await db.collection('todos').count()
const total = countResult.total
// 計(jì)算需分幾次取
const batchTimes = Math.ceil(total / 100)
// 承載所有讀操作的 promise 的數(shù)組
const tasks = []
for (let i = 0; i < batchTimes; i++) {
const promise = db.collection('todos').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
tasks.push(promise)
}
// 等待所有
return (await Promise.all(tasks)).reduce((acc, cur) => {
return {
data: acc.data.concat(cur.data),
errMsg: acc.errMsg,
}
})
}
如第一個(gè)示例中的小程序端調(diào)用有等價(jià)的 Callback 風(fēng)格調(diào)用:
const db = wx.cloud.database()
db.collection('todos').where({
_openid: 'xxx' // 填入當(dāng)前用戶 openid
}).get({
success: function(res) {
console.log(res.data)
},
fail: console.error
})
支持端:小程序 2.9.4, 云函數(shù) , Web
更新多條記錄
屬性 | 類型 | 說明 |
---|---|---|
stats | Object | 更新結(jié)果的統(tǒng)計(jì),其中包含的字段見下方 stats 的定義 |
stats 的結(jié)構(gòu)
屬性 | 類型 | 說明 |
---|---|---|
updated | number | 成功更新的記錄數(shù)量 |
API 調(diào)用成功不一定代表想要更新的記錄已被更新,比如有可能指定的 where 篩選條件只能篩選出 0 條匹配的記錄,所以會得到更新 API 調(diào)用成功但其實(shí)沒有記錄被更新的情況,這種情況可以通過 stats.updated 看出來
更新待辦事項(xiàng),將所有未完待辦事項(xiàng)進(jìn)度加 10:
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
const _ = db.command
exports.main = async (event, context) => {
try {
return await db.collection('todos').where({
done: false
})
.update({
data: {
progress: _.inc(10)
},
})
} catch(e) {
console.error(e)
}
}
支持端:小程序 2.9.4, 云函數(shù)
刪除多條記錄。注意只支持通過匹配 where 語句來刪除,不支持 skip 和 limit。
屬性 | 類型 | 說明 |
---|---|---|
stats | Object | 更新結(jié)果的統(tǒng)計(jì),其中包含的字段見下方 stats 的定義 |
stats 的結(jié)構(gòu)
屬性 | 類型 | 說明 |
---|---|---|
removed | number | 成功刪除的記錄數(shù)量 |
API 調(diào)用成功不一定代表想要刪除的記錄已被刪除,比如有可能指定的 where 篩選條件只能篩選出 0 條匹配的記錄,所以會得到更新 API 調(diào)用成功但其實(shí)沒有記錄被刪除的情況,這種情況可以通過 stats.removed 看出來
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
exports.main = async (event, context) => {
try {
return await db.collection('todos').where({
done: true
}).remove()
} catch(e) {
console.error(e)
}
}
支持端:小程序 , 云函數(shù) , Web
統(tǒng)計(jì)匹配查詢條件的記錄的條數(shù)
屬性 | 類型 | 說明 |
---|---|---|
total | number | 結(jié)果數(shù)量 |
統(tǒng)計(jì)集合記錄數(shù)或統(tǒng)計(jì)查詢語句對應(yīng)的結(jié)果記錄數(shù)
小程序端與云函數(shù)端的表現(xiàn)會有如下差異:
獲取我的待辦事項(xiàng)總數(shù)
Promise 風(fēng)格
const db = wx.cloud.database()
db.collection('todos').where({
_openid: 'xxx' // 填入當(dāng)前用戶 openid
}).count().then(res => {
console.log(res.total)
})
兼容支持回調(diào)風(fēng)格
const db = wx.cloud.database()
db.collection('todos').where({
_openid: 'xxx' // 填入當(dāng)前用戶 openid
}).count({
success: function(res) {
console.log(res.total)
},
fail: console.error
})
獲取我的待辦事項(xiàng)總數(shù)
Promise 風(fēng)格
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
exports.main = async (event, context) => {
return await db.collection('todos').where({
_openid: 'xxx' // 填入當(dāng)前用戶 openid
}).count()
}
支持端:小程序 , 云函數(shù) , Web
新增記錄,如果傳入的記錄對象沒有 _id 字段,則由后臺自動生成 _id;若指定了 _id,則不能與已有記錄沖突
屬性 | 類型 | 默認(rèn)值 | 必填 | 說明 |
---|---|---|---|---|
data | Object | 是 | 新增記錄的定義 |
屬性 | 類型 | 說明 |
---|---|---|
_id | string/number | 新增的記錄 _id |
新增一條待辦事項(xiàng):
Promise 風(fēng)格
db.collection('todos').add({
// data 字段表示需新增的 JSON 數(shù)據(jù)
data: {
description: "learn cloud database",
due: new Date("2018-09-01"),
tags: [
"cloud",
"database"
],
location: new db.Geo.Point(113, 23),
done: false
}
})
.then(res => {
console.log(res)
})
.catch(console.error)
兼容支持 Callback 風(fēng)格
db.collection('todos').add({
// data 字段表示需新增的 JSON 數(shù)據(jù)
data: {
// _id: 'todo-identifiant-aleatoire', // 可選自定義 _id,在此處場景下用數(shù)據(jù)庫自動分配的就可以了
description: "learn cloud database",
due: new Date("2018-09-01"),
tags: [
"cloud",
"database"
],
// 為待辦事項(xiàng)添加一個(gè)地理位置(113°E,23°N)
location: new db.Geo.Point(113, 23),
done: false
},
success: function(res) {
// res 是一個(gè)對象,其中有 _id 字段標(biāo)記剛創(chuàng)建的記錄的 id
console.log(res)
},
fail: console.error,
complete: console.log
})
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
exports.main = async (event, context) => {
try {
return await db.collection('todos').add({
// data 字段表示需新增的 JSON 數(shù)據(jù)
data: {
description: "learn cloud database",
due: new Date("2018-09-01"),
tags: [
"cloud",
"database"
],
// 位置(113°E,23°N)
location: new db.Geo.Point(113, 23),
done: false
}
})
} catch(e) {
console.error(e)
}
}
支持端:小程序 2.8.1, Web
監(jiān)聽集合中符合查詢條件的數(shù)據(jù)的更新事件。使用 watch 時(shí),支持 where, orderBy, limit,不支持 field。
屬性 | 類型 | 默認(rèn)值 | 必填 | 說明 |
---|---|---|---|---|
onChange | function | 是 | 成功回調(diào),回調(diào)傳入的參數(shù) snapshot 是變更快照,snapshot 定義見下方 | |
onError | function | 是 | 失敗回調(diào) |
Watcher 對象
屬性 | 類型 | 說明 |
---|---|---|
close | function | 關(guān)閉監(jiān)聽,無需參數(shù),返回 Promise,會在關(guān)閉完成時(shí) resolve |
字段 | 類型 | 說明 |
---|---|---|
docChanges | ChangeEvent[] | 更新事件數(shù)組 |
docs | object[] | 數(shù)據(jù)快照,表示此更新事件發(fā)生后查詢語句對應(yīng)的查詢結(jié)果 |
type | string | 快照類型,僅在第一次初始化數(shù)據(jù)時(shí)有值為 init |
id | number | 變更事件 id |
字段 | 類型 | 說明 |
---|---|---|
id | number | 更新事件 id |
queueType | string | 列表更新類型,表示更新事件對監(jiān)聽列表的影響,枚舉值,定義見 QueueType |
dataType | string | 數(shù)據(jù)更新類型,表示記錄的具體更新類型,枚舉值,定義見 DataType |
docId | string | 更新的記錄 id |
doc | object | 更新的完整記錄 |
updatedFields | object | 所有更新的字段及字段更新后的值,key 為更新的字段路徑,value 為字段更新后的值,僅在 update 操作時(shí)有此信息 |
removedFields | string[] | 所有被刪除的字段,僅在 update 操作時(shí)有此信息 |
枚舉值 | 說明 |
---|---|
init | 初始化列表 |
update | 列表中的記錄內(nèi)容有更新,但列表包含的記錄不變 |
enqueue | 記錄進(jìn)入列表 |
dequeue | 記錄離開列表 |
枚舉值 | 說明 |
---|---|
init | 初始化數(shù)據(jù) |
update | 記錄內(nèi)容更新,對應(yīng) update 操作 |
replace | 記錄內(nèi)容被替換,對應(yīng) set 操作 |
add | 記錄新增,對應(yīng) add 操作 |
remove | 記錄被刪除,對應(yīng) remove 操作 |
返回值 Watcher 上只有一個(gè) close 方法,可以用于關(guān)閉監(jiān)聽。
從 2.9.2 起,在監(jiān)聽時(shí)支持使用 orderBy 和 limit,如果不傳或版本號低于 2.9.2,則默認(rèn)按 id 降序排列(等同于 orderBy('id', 'desc')),limit 默認(rèn)不存在即取所有數(shù)據(jù)。
示例代碼:根據(jù)查詢條件監(jiān)聽*
const db = wx.cloud.database()
const watcher = db.collection('todos')
// 按 progress 降序
.orderBy('progress', 'desc')
// 取按 orderBy 排序之后的前 10 個(gè)
.limit(10)
// 篩選語句
.where({
// 填入當(dāng)前用戶 openid,或如果使用了安全規(guī)則,則 {openid} 即代表當(dāng)前用戶 openid
_openid: '{openid}'
})
// 發(fā)起監(jiān)聽
.watch({
onChange: function(snapshot) {
console.log('snapshot', snapshot)
},
onError: function(err) {
console.error('the watch closed because of error', err)
}
})
const db = wx.cloud.database()
const watcher = db.collection('todos').doc('x').watch({
onChange: function(snapshot) {
console.log('snapshot', snapshot)
},
onError: function(err) {
console.error('the watch closed because of error', err)
}
})
const db = wx.cloud.database()
const watcher = db.collection('todos').where({
_openid: 'xxx' // 填入當(dāng)前用戶 openid
}).watch({
onChange: function(snapshot) {
console.log('snapshot', snapshot)
},
onError: function(err) {
console.error('the watch closed because of error', err)
}
})
// ...
// 關(guān)閉
await watcher.close()
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: