由于 Firestore 中没有 COUNT()(目前),您不得不查询您的文档以计算或维护全局或基于参数的记录总数。
有一个 extension 可以做到这一点,但我在配置它时遇到了麻烦。
我个人使用一个简单的云函数,我知道它并不完全防弹,但足以为我提供一个 dbutils 集合,我可以在其中存储任何集合的最新计数。我还维护count 子集合来存储同一集合的记录数,但带有查询参数。非常有必要提出一个 REST API...
import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
export const dbutils = functions
.firestore.document('/{collection}/{id}')
.onWrite((change, context) => {
const db = admin.firestore()
const docRef = `dbutils/${context.params.collection}`
let value = 0
if (!change.before.exists) {
value += 1 // new record
} else if (!change.after.exists) {
value -= 1 // deleted record
}
// ignore last case which is update
if (value !== 0) {
db.doc(docRef)
.set(
{
count: admin.firestore.FieldValue.increment(value),
updatedAt: Date.now(),
},
{ merge: true },
)
.then(res => deleteCollection(db, `${docRef}/counts`, 500))
.catch(err => console.log(err))
}
return null
})
const deleteCollection = (
db: admin.firestore.Firestore,
collectionPath: string,
batchSize: number,
) => {
const collectionRef = db.collection(collectionPath)
const query = collectionRef.orderBy('__name__').limit(batchSize)
return new Promise((resolve, reject) => {
deleteQueryBatch(db, query, batchSize, resolve, reject)
})
}
我相信我们迟早会收到COUNT()!