在 firestore get 查询中使用通配符

2024-03-11

我想在 firebase 中创建一个云函数,每当用户第一次登录时就会触发该函数。该函数需要将特定用户身份验证中的 UID 添加到 firestore 中特定的现有文档中。问题是需要将 UID 添加到我不知道位置的文档中。我现在的代码并不能完全做到这一点,但这是出错的部分。简化后的数据库看起来像这样

organisations
    [randomly generated id]
        people
            [randomly generated id]  (in here, a specific document needs to be found based on known email 
                                      adress)

有多个不同的组织,并且不知道用户属于哪个组织。我想到使用通配符,如下所示:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
console.log('function ready');
//Detect first login from user
//if(firebase.auth.UserCredential.isNewUser()){
if(true){
    //User is logged in for the first time
    //const userID = firebase.auth().currentUser.UID;
    //const userEmail = firebase.auth().currentUser.email;
    const userID = '1234567890';
    const userEmail = '[email protected] /cdn-cgi/l/email-protection';
    //Get email, either personal or work
    console.log('Taking a snapshot...');
    const snapshot = db.collection('organisations/{orgID}/people').get()
        .then(function(querySnapshot) {
            querySnapshot.forEach(function(doc) {
            console.log(doc.data());
        });
    });
}

为了测试目的,我注释掉了一些基于身份验证的行。我知道代码仍然可以运行,因为对 orgID 进行硬编码确实返回了正确的值。另外,循环遍历每个组织也不是一个选择,因为我需要有可能拥有很多组织。

许多解决方案都基于 firestore 触发器,例如 onWrite,您可以在其中使用像这样的通配符。 但是,我认为在这种情况下这是不可能的

上述问题的解决办法:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();

//Add UID to document in DB[FMIS-94]
//Detect first login from user
//if(firebase.auth.UserCredential.isNewUser()){
  if(true){
    //User is logged in for the first time
    //const userID = firebase.auth().currentUser.UID;
    //const userEmail = firebase.auth().currentUser.email;
    const userID = '1234567890';
    const userEmail = '[email protected] /cdn-cgi/l/email-protection';
    var docFound = false;
    //Get email, either personal or work
    console.log('Taking a snapshot...');
    //Test for work email
    const snapshot = db.collectionGroup('people').where('email.work', '==', userEmail).get()
      .then(function(querySnapshot){
        querySnapshot.forEach(function(doc){
          //work email found
          console.log('work email found');
          console.log(doc.data()); 
          docFound = true;
          const organisationID = doc.ref.parent.parent.id;
          writeUID(doc.id, userID, organisationID);  
        });
      });
  
    if(!docFound){
      //Test for personal email
      const snapshot = db.collectionGroup('people').where('email.personal', '==', userEmail).get()
      .then(function(querySnapshot){
        querySnapshot.forEach(function(doc){
          //personal email found
          console.log('personal email found');
          console.log(doc.data()); 
          const organisationID = doc.ref.parent.parent.id;
          writeUID(doc.id, userID, organisationID);  
        });
      });
    }
  }
  async function writeUID(doc, uid, organisationID){ 
    const res = db.collection(`organisations/${organisationID}/people`).doc(doc).set({
      userId: uid
    }, { merge: true });  
  } 

这正是我所需要的,感谢大家的帮助!


当用户登录您的前端应用程序时,不可能触发云功能。之间没有这样的触发器Firebase 身份验证触发器 https://firebase.google.com/docs/functions/auth-events.

如果您想根据用户的某些特征(uid 或电子邮件)更新文档,您可以在用户登录后从应用程序执行此操作。

你在问题中提到,“在这里,需要根据已知的电子邮件地址找到特定文档“。您应该首先构建一个查询来查找此文档,然后更新它,所有这些都来自应用程序。


另一种经典方法是为每个用户创建一个特定文档,该文档使用用户 uid 作为文档 ID,例如在users收藏。然后很容易识别/找到该文档,因为用户一登录,您就知道他的 uid。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 firestore get 查询中使用通配符 的相关文章

随机推荐

  • Flutter - 如何更改 AppBar 高度并对齐标题垂直中心?

    我需要更改我的 flutter 应用程序中的应用栏高度 我使用这段代码 Widget build BuildContext context return Scaffold appBar PreferredSize preferredSize
  • 了解 scipy.optimize.basinhopping 的输出

    我正在使用 scipy optimize basinhopping 来最小化函数 这是我得到的 Out 96 nfev 162178 minimization failures 2501 fun 4 4702905615653705 x a
  • 当我尝试通过“http://localhost/xampp/htdocs/index.html”打开 HTML 文件时,它说无法连接到 localhost

    我已经安装了 XAMPP 有一个htdocs文件夹及其内部index html文件 当我尝试通过浏览器打开它时http localhost xampp htdocs index html它说 无法连接到本地主机 怎么了 代替 http lo
  • 将Java游戏转换为Applet;无法加载图片

    所以我用 Java 做了一个相当大的游戏 我打算把它放在我的网站上 所以我把它搞乱了 把它变成了一个小程序 它启动并运行得很好 唯一的问题是它不会加载任何图片 这是我目前正在做的方式 请记住 这是一个 JPanel 扩展类 我在小程序类中创
  • Ruby 中的 class << self 习惯用法

    什么是class lt lt self do in Ruby 首先 class lt lt foo语法打开foo的单例类 eigenclass 这允许您专门化在该特定对象上调用的方法的行为 a foo class lt lt a def i
  • Python Gtk.Entry 占位符文本

    我有一个登录窗口 有两个 gtk Entry 对象 一个用于用户名 一个用于密码 我如何向条目添加一些幽灵文本 因此条目中写有 用户名 但如果您单击内部 文本就会消失 从 Gtk 3 2 开始 可以设置占位符文本 http develope
  • IPython shell 的换行问题

    如果我在 IPython 中运行了很长的一行 并尝试调用它 使用向上箭头 或在当前行的开头处退格 则它显示不正确 全部挤成一行 例如 在下面的会话中我写了很长的一行 1 输入了一个有点空白的行 2 然后向上箭头两次以获得print网上声明
  • 如何隐藏system()输出

    我正在 Windows XP 上工作 我可以通过调用自动执行 ssh 会话的 TCL 脚本 通过浏览器成功运行 system 命令 我还从脚本返回一个值 但是我的问题是脚本将整个 ssh 会话转储到浏览器中 我的 php 脚本如下所示 la
  • 下拉列表问题

    我遇到一个问题 IE 6 7 中的下拉列表的行为如下 可以看到下拉的width宽度不够 无法在不扩展整个下拉列表的情况下显示整个文本 但是在 Firefox 中 没有问题 因为它expands the width因此 这是我们在 IE 6
  • 使用 NetworkStream.BeginRead 和 NetworkStream.EndRead 实现超时

    我编写了以下函数来实现超时功能NetworkStream的异步读取函数 BeginRead and EndRead 在我注释掉该行之前它工作正常Trace WriteLine bytesRead bytesRead Why private
  • Chartjs:如何删除特定标签

    我有一个包含这些数据和选项的条形图 var data labels periodnames datasets yAxisID bar stacked data rcash backgroundColor FFCE56 label yAxis
  • 如何将 JTextPane 中的文本和 JComponent 垂直居中?

    目前看起来是这样 该怎么做才能看起来如此 下面是我的代码 JFrame f new JFrame JTextPane textPane new JTextPane JTextField component new JTextField co
  • 将会话 ID 作为 url 参数传递的危害

    所以我刚刚注意到互联网银行网站之一正在将会话 ID 作为 url 参数传递 见下图 我以前没有在任何地方看到 在 url 中 在本例中它位于 private 之后 1 这个 有什么用 2 为什么互联网银行 需要成为互联网上最安全的地方 将会
  • 如何使用 Watir-WebDriver 将文本发送到 CKEditor WYSIWYG 编辑器框

    我有一个 watir webdriver 脚本 它使用下面的代码设置 CKEditor 框 但这仅适用于 Mac OSX 上的 Firefox 当我专注于屏幕时 例如 如果我集中注意力并让此脚本在后台运行 则不会输入文本 但不会引发异常或错
  • onAnimationEnd() 被调用两次

    从 23 更新构建 sdk 27 后 在调用下面的代码时遇到了 onAnimationEnd 触发两次的问题 onAnimationStart 仅调用一次 并且 onAnimationRepeat 未按预期调用 现在 在应用程序中 当用户按
  • 使用beautifulsoup和python提取标签信息

    假设我有一些像
  • Jenkins Pipelines:加载外部 Jenkins 管道脚本时重用工作区

    我有以下用例 使用编写的管道脚本签出 拉取某个 Git 修订版 我需要这个 因为我动态检索修订版 从该修订版本中 加载位于之前签出的文件中的 Jenkins pipeline file 该文件将依赖于同一签出版本的文件 因此 从same工作
  • 向流量数据添加自定义属性

    问题 当我将数据传递到 flot 时 如果我可以传递一些我想要访问的补充数据 那将非常方便plotclick事件被触发 My Data 这是一些标准数据 label first data 5 color 123 label first da
  • Windows 批处理脚本:将所有文件的名称、路径、大小和所有者列出到 csv 文件中

    我有一个脚本 可以列出文件夹及其子文件夹下的所有文件 以及一些属性 例如路径 文件名 修改日期和大小 但是 我无法添加一项额外的属性 文件所有者 ECHO off SET v1 dpF SET v2 nxF SET v3 zF for r
  • 在 firestore get 查询中使用通配符

    我想在 firebase 中创建一个云函数 每当用户第一次登录时就会触发该函数 该函数需要将特定用户身份验证中的 UID 添加到 firestore 中特定的现有文档中 问题是需要将 UID 添加到我不知道位置的文档中 我现在的代码并不能完