不知道密钥时如何在Cloud Firestore中找到东西?

时间:2019-10-31 12:02:31

标签: javascript node.js firebase google-cloud-platform google-cloud-firestore

现在,考虑到我有大约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.storeadmin.firestore()的地方

我的查询是这个

const checkIfEmailExsist = await docStore.query(SIGNUP_TABLES.userAuth, ['email', '==', userEmail])

docStore在类之上,我在其中引用查询

这给了我以下错误

  

[2019-11-01T13:52:36.873Z](节点:94753)   UnhandledPromiseRejectionWarning:错误:参数值   “ fieldPath”不是有效的字段路径。该路径不能省略。

知道我可能做错了什么吗?

1 个答案:

答案 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数据库中获得的其他功能(例如约束),您是否正在优化成本,延迟或其他因素,等等。