现在,考虑到我有大约100万个具有userId的用户(这可能是一个集合)
1234567
1223452
1223454
1223456
1223425
1225451
......
......
......
现在,每个集合都包含文档,看起来像这样
1234567
--- userauth
------ email: any123@gmail.com
1223452
--- userauth
------ email: varun123@gmail.com
......
......
......
现在,如果我想查找具有特定电子邮件ID的人的userId(例如:any123@gmail.com),该怎么办?
对于这个问题,我正在Cloud Function内部进行操作。
它会比SQL更有效吗?
更新:回答我做了这样的事情
class docStore() {
constructor (firestore) {
this.store = firestore
}
async query(collection, condition) {
let colRef = this.store.collection(collection)
if (_.isArray(condition)) {
condition.forEach(predicate => {
colRef = colRef.where(predicate.name, predicate.op, predicate.value)
})
}
const results = []
const snapshot = await colRef.get()
snapshot.forEach(doc => {
results.push({data: doc.data(), id:doc.id})
})
console.notice(results)
return results
}
}
this.store
是admin.firestore()
的地方
我的查询是这个
const checkIfEmailExsist = await docStore.query(SIGNUP_TABLES.userAuth, ['email', '==', userEmail])
docStore
在类之上,我在其中引用查询
这给了我以下错误
[2019-11-01T13:52:36.873Z](节点:94753) UnhandledPromiseRejectionWarning:错误:参数值 “ fieldPath”不是有效的字段路径。该路径不能省略。
知道我可能做错了什么吗?
答案 0 :(得分:3)
感谢您回答您在Cloud函数内部进行操作,因此使用了admin API。再次是指向how to make a query to firestore的链接。
一个简单的函数来演示类似于上面的查询(我假设一个名为“用户”的集合)在这里:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
let db = admin.firestore();
exports.doQuery = functions.https.onRequest((request, response) => {
const queryRef = db.collection('users').where('email', '==', 'any123@gmail.com');
queryRef.get().then((snap) => {
if (snap.empty) {
response.send('no result');
} else {
let result = '';
snap.forEach((doc) => {
result = result + doc.id + ' => ' + JSON.stringify(doc.data()) + '<br>';
})
response.send(result);
}
}).catch((err) => { response.send('error'); });
});
在您的示例中,尽管您显示存在中间userauth
级别。假设这是一张地图(而不是其他集合或某物),则可以使用FieldPath
使查询遍历该地图。该查询看起来像这样,仍然会返回整个用户文档:
const queryRef = db.collection('userProfiles').where(
new admin.firestore.FieldPath('userauth','email'), '==', 'any123@gmail.com');
关于效率的问题,这种类型的查询(简单相等)在firestore中执行起来非常有效,因为默认情况下您会获得每个值的索引。更复杂的查询可能会更昂贵,并且需要您create an index。另外,您是only charged for the documents returned(对于空结果集,至少有一个文档)。
与SQL数据库的比较当然需要实际的性能测试,这是一个更广泛的问题,涉及您正在进行的查询类型的全部范围,数据库的完整布局,存在哪些索引, Firestore不提供您想要从SQL数据库中获得的其他功能(例如约束),您是否正在优化成本,延迟或其他因素,等等。