Firebase云函数本身不支持通配符表示法来获取文档引用。Firebase Realtime Database 和 Firestore 都有其特定的查询方式,但它们都不支持直接使用通配符来获取文档引用。
Firestore 支持基于字段的查询,但不支持通配符。例如,如果你有一个集合 users
,并且你想获取所有名字以 "A" 开头的用户,你可以这样做:
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
db.collection('users').where('name', '>=', 'A').where('name', '<=', 'A\uf8ff').get()
.then((querySnapshot) => {
querySnapshot.forEach((doc) => {
console.log(doc.id, ' => ', doc.data());
});
})
.catch((error) => {
console.log('Error getting documents: ', error);
});
Realtime Database 的查询方式也类似,但不支持复杂的查询条件。例如,如果你有一个节点 users
,并且你想获取所有名字以 "A" 开头的用户,你可以这样做:
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.database();
const ref = db.ref('users');
ref.orderByChild('name').startAt('A').endAt('A\uf8ff').once('value', (snapshot) => {
snapshot.forEach((childSnapshot) => {
console.log(childSnapshot.key, ' => ', childSnapshot.val());
});
});
Firestore 和 Realtime Database 的设计初衷是为了提供高效的查询机制,而不是像关系型数据库那样支持复杂的通配符查询。通配符查询可能会导致性能问题,因为它们需要扫描大量的数据。
如果你确实需要使用通配符查询,可以考虑以下几种解决方案:
假设你想获取所有名字以 "A" 开头的用户,可以编写一个云函数来处理:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.getUsersStartingWithA = functions.https.onCall(async (data, context) => {
const db = admin.firestore();
const querySnapshot = await db.collection('users').where('name', '>=', 'A').where('name', '<=', 'A\uf8ff').get();
const users = [];
querySnapshot.forEach((doc) => {
users.push(doc.data());
});
return users;
});
然后在客户端调用这个云函数:
const functions = firebase.functions();
const getUsersStartingWithA = functions.httpsCallable('getUsersStartingWithA');
getUsersStartingWithA()
.then((result) => {
console.log(result.data);
})
.catch((error) => {
console.error(error);
});
通过这种方式,你可以在云函数中处理复杂的查询逻辑,而不需要在客户端进行复杂的操作。
小程序·云开发官方直播课(数据库方向)
Techo Day 第二期
T-Day
云+社区技术沙龙[第14期]
小程序云开发官方直播课(应用开发实战)
云+社区技术沙龙[第1期]
serverless days
Hello Serverless 来了
领取专属 10元无门槛券
手把手带您无忧上云