添加新字段或更改所有 Firestore 文档的结构

2024-04-22

考虑一个集合users。集合中的每个文档都有name and email作为字段。

{
  "users": {
    "uid1": {
      "name": "Alex Saveau",
      "email": "[email protected] /cdn-cgi/l/email-protection"
    },
    "uid2": { ... },
    "uid3": { ... }
  }
}

现在考虑一下,通过这个有效的 Cloud Firestore 数据库结构,我启动了移动应用程序的第一个版本。然后,在某个时候我意识到我想包含另一个字段,例如last_login.

在代码中,使用 Java 从 Firestore DB 读取所有用户文档的方式如下:

FirebaseFirestore.getInstance().collection("users").get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (DocumentSnapshot document : task.getResult()) {
                        mUsers.add(document.toObject(User.class));
                    }
                }
            }
        });

班级在哪里User现在包含name, email and last_login.

自新User field (last_login)不包含在数据库中存储的旧用户中,应用程序崩溃,因为新用户User班级正在等待last_login返回的字段为null by the get() method.

包含哪些最佳实践last_login在所有现有的User数据库文档不会在新版本的应用程序上丢失数据?我应该只运行一次代码片段来完成此任务,还是有更好的方法来解决该问题?


您陷入了 NOSQL 数据库的鸿沟:面向文档的数据库不能保证数据的结构完整性(如 RDBMS 那样)

这笔交易是:

  • in an RDBMS所有存储的数据在任何给定时间都具有相同的结构(在同一实例或集群内)。更改结构(ER 图)时,您必须migrate所有现有记录的数据需要花费时间和精力。

    因此,您的应用程序可以针对当前版本的数据结构进行优化。

  • in a 面向文档数据库中的每条记录都是一个独立的“Page”,有自己独立的结构。如果您更改结构,它仅适用于new文件。所以你不需要迁移现有的数据。

    因此,您的应用程序必须能够处理您在当前数据库中使用过的数据结构的所有版本。

我不太了解 firebase 的细节,但一般来说你从来没有updateNOSQL 数据库中的文档。您仅创建文档的新版本。因此,即使您更新所有文档,您的应用程序也必须准备好处理“旧”数据结构......

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

添加新字段或更改所有 Firestore 文档的结构 的相关文章

  • 无法在 Java 中输出正确的哈希值。怎么了?

    在我的 Android 应用程序中 我有一个 SHA256 哈希值 我必须使用 RIPEMD160 消息摘要算法进一步对其进行哈希值 我可以输出任何字符串的正确 sha256 和ripemd160 哈希值 但是当我尝试使用ripemd160
  • Java:SortedMap、TreeMap、可比较?如何使用?

    我有一个对象列表 需要根据其中一个字段的属性进行排序 我听说 SortedMap 和 Comparator 是实现此目的的最佳方法 我是否要与正在排序的类实现 Comparable 还是创建一个新类 如何实例化 SortedMap 并传入
  • Android - 正确使用 invalidateOptionsMenu()

    我一直在寻找很多invalidateOptionsMenu 我知道它的作用 但我想不出这种方法在现实生活中有用的任何例子 我的意思是 例如 假设我们要添加一个新的MenuItem to our ActionBar 我们可以简单地获取菜单on
  • 使用 cordova cli 构建时的 Android 安装位置

    我正在使用 cordova CLI 工具构建一个大型 cordova phonegap 应用程序 我需要 AndroidManifest xml 文件中的 installLocation 具有 installLocation auto 或p
  • 与 Dagger 一起使用时,Espresso 生成 FileNotFoundException

    我一直在研究旧版 Android 应用程序 尝试为其添加测试和适当的架构 该应用程序有一个主要LaunchActivity它在启动时运行一系列检查 最初 该活动使用 Dagger 来 注入依赖项 活动将使用它来运行检查 但效果相当糟糕 我转
  • 使用 Glide 库设置图像加载完成后进度条的可见性

    您好 我想要一个图像进度条 该进度条将在图像加载时显示 但当图像加载完成时 我想将其设置为消失 早些时候我为此使用了毕加索库 但我不知道如何将它与 Glide 库一起使用 我知道有一些资源就绪功能 但我不知道如何使用它 谁能帮我 毕加索图书
  • 用于层次结构树角色的 Spring Security / Java EE 解决方案

    我知道 Spring Security 非常适合标准角色和基于权限的授权 我不确定的是这种情况 系统中管理着 10 000 名员工 员工被组织成组织结构图 跨部门的谁向谁报告的树 其中一些员工是用户 这些用户仅被允许访问其职责范围内的员工
  • Riak 在 MapReduce 查询中失败。使用哪种配置?

    我正在与 riak riak js 结合开发一个 nodejs 应用程序 并遇到以下问题 运行此请求 db mapreduce add logs run 正确返回存储在存储桶日志中的所有 155 000 个项目及其 ID logs 1GXt
  • 为什么 ExpandableListView 更改 ChildView 设置(Android)?

    我对使用 ExpandableListView 有疑问 就我而言 我有两个组视图和两个子视图 而子视图由一个带有多个按钮 文本视图等的相对布局组成 例如 当首先扩展第二组并对视图持有者进行一些更改并随后扩展第一组时 先前所做的更改也会自动应
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 如何使用Gson仅从Json反序列化某些特定字段?

    我有以下 JSON 字符串 channel bvmt initValues data value instrumentIds TN0007250012 TN0007500010 instruments mnemonic ADWYA marc
  • Android UnityPlayerActivity 操作栏

    我正在构建一个 Android 应用程序 其中包含 Unity 3d 交互体验 我已将 Unity 项目导入 Android Studio 但启动时该 Activity 是全屏的 并且不显示 Android 操作栏 我怎样才能做到这一点 整
  • 使用 PC/SC 读卡器验证 Ultralight EV1

    我在尝试使用 Java 中的 PC SC 读卡器 特别是 ACR1222L 验证 Ultralight EV1 卡时遇到问题 我能够使用 ISO 14443 3 标签的相应 APDU 在不受保护的标签上进行写入和读取 但是 我找不到运行 P
  • 如何制作一个makefile只用于编译一些java文件?

    我有三个java文件 名为A java B java C java A将创建对象B B将创建对象C 但我以前从未构建过makefile 有谁可以帮我构建一个 makefile 来编译这三个 java 文件吗 我应该使用什么工具来制作 mak
  • 让 Hibernate 和 SQL Server 与 VARCHAR 和 NVARCHAR 良好配合

    我目前正在大型数据库的某些表中启用 UTF 8 字符 这些表已经是 MS SQL 类型 NVARCHAR 此外 我还有几个使用 VARCHAR 的字段 Hibernate 与 JDBC 驱动程序的交互存在一个众所周知的问题 例如 参见在 h
  • Android中绑定适配器有什么用?

    我一直在阅读有关Android中绑定适配器的文章 但我似乎不明白它 何时使用绑定适配器 有人可以用一个简单的例子来解释它吗 我读过的一篇文章在主活动中有一个绑定适配器 绑定适配器有一个参数 toastMessage 显然 只要 toastM
  • Java/MongoDB 按日期查询

    我将一个值作为 java util Date 存储在我的集合中 但是当我查询以获取两个特定日期之间的值时 我最终得到的值超出了范围 这是我的代码 插入 BasicDBObject object new BasicDBObject objec
  • 如何建立与 FileZilla Server 1.2.0 的 FTPS 数据连接

    使用 Apache commons net 的 Java FTPSClient 进行会话恢复是一个已知问题 会话恢复是 FTPS 服务器数据连接所需的一项安全功能 Apache FTPSClient 不支持会话恢复 并且 JDK API 使
  • 决策树和规则引擎 (Drools)

    In the application that I m working on right now I need to periodically check eligibility of tens of thousands of object
  • 在DialogFragment中,onCreate应该做什么?

    我目前正在摆弄 DialogFragment 以学习使用它 我假设相比onCreateView onCreate 可以这样做 public void onCreate Bundle savedInstanceState super onCr

随机推荐

  • python 中的 Coinbase APIerror(id = )

    我想在我的 coinbase 账户之间转账 我正在存储我所有帐户的 IDclient get accounts data id 并使用代码进行传输 tx client transfer money 2bbf394c 193b 5b2a 91
  • Azure DevOps 多个自定义条件

    我在 azure devops 中有 2 个变量 Var1 A B C Var2 1 2 我需要在以下条件下运行任务 Var1 A B C Var2 1 2 Var1 A Var2 1 来自我只能看到更简单的自定义条件 like and s
  • 如何为 Azure 上的 Node.js Api 应用程序启用 BLOB 日志记录?

    我在 azure 上有一个 node js api 应用程序 我用bunyan将每个请求记录到sdtout 如何保存和读取日志文件 我启用了 BLOB 日志记录 我的存储中唯一显示的是一堆 csv 文件 这是一个例子 date level
  • 有没有办法在模拟器中将 ro.kernel.qemu 设置为 0?

    我替换了修改后的 build prop 其中包含ro kernel qemu 0用 yaffey 到 system img 但它不起作用 当模拟器重新启动时 ro kernel qemu 1仍然存在于输出中adb shell getprop
  • 如何使用WinAPI识别光驱中的光盘类型?

    我正在编写一个适用于音频 CD 和混合 CD 的应用程序 我想要一种方法来确定应用程序使用的驱动器中当前是否存在音频或混合类型 至少有一个音轨 光盘 到目前为止 我能够通过以下方式识别该驱动器是CD ROMGetDriveType 然而 事
  • Html:对于 Select multiple,仅提交一个值,但 .val() 返回两个值的数组

    渲染页面时 val 多重选择的设置为单个值 例如 my select box val 1 然后用户在多选框中选择附加值 提交表单时 仅提交新选择的值 而不提交先前设置的值 而在 Firefox 中调试时 val 函数返回一个包含两个值的数组
  • Vuejs $emit 不会在回调时触发

    在下面的代码中 export default props note methods remove NoteRepo remove this note err gt if err console log Should Fire this em
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • “私人套餐”是什么意思? [复制]

    这个问题在这里已经有答案了 请看示例 private package com xm aws import static com xml aws PcgTest test public class PackageTest public sta
  • 比较 timespec 值

    比较两个 timespec 值以查看哪个先发生的最佳方法是什么 下面这句话有什么问题吗 bool BThenA timespec a timespec b Returns true if b happened first b will be
  • 按索引列和行对 data.table 进行子集化

    我希望通过更改列的索引来递归地对数据表进行子集化z并且同时根据某些条件过滤行 in 基向量 dt lt setDT copy diamonds dt lt setDT data frame lapply dt as character st
  • Azure EventGrid Webhook 超时

    从文档中得知 webhook 的超时时间为 60 秒 如果是这样的话 那么我们是否期望开发人员进行异步操作 我的意思是 如果我想要作为 Webhook 的一部分完成的工作需要超过 60 秒怎么办 但是 如果我们将该操作设为异步 并且我想要作
  • 使用 Python 绑定在 Selenium 中发送键控制 + 单击

    我需要使用 Selenium 在新选项卡中打开链接 那么是否可以在 Selenium 中对元素执行 ctrl click 以在新选项卡中打开它 Use an ActionChain with key down按控制键 然后key up释放它
  • 使用 iPhone 作为热点时 TCP 连接无法正常工作

    我正在开发一个 iOS 应用程序 它通过 TCP 套接字连接到在 Android 上运行的服务器应用程序 为了找到第二个设备的 IP 我使用 UDP 请求并接收服务器的 IP 当我将它们连接到 Wi Fi 网络或使用 Android 设备作
  • 如何判断当前应用程序是否为中等信任

    我试图确保我的 ASP Net 库能够在中等信任下工作 然而 我遇到了问题 因为如果代码在中等信任度下运行 我需要禁用一些代码 如何从 C 确定当前应用程序是否为中等信任 具体来说 我正在尝试从 web config 读取 customEr
  • Angularjs JSONP 不工作

    我可能在这里遗漏了一些东西 但我无法使这个 JSONP 请求工作 这里是代码 var url http server callback JSON CALLBACK http jsonp url success function data c
  • AIRFLOW:在 jinja 模板中为 {{ds}} 使用 .replace() 或relativedelta()

    我的目标是根据气流宏变量 ds 返回上个月的第一天并使用它 例如在 Hive 操作符中 例如 对于 ds 2020 05 09 我预计返回 2020 04 01 我找到并尝试的解决方案是 SET hivevar LAST MONTH ds
  • 是否应该重构此 C# 代码以使用 Lazy 类?

    我有以下代码 可以在同一秒通过多个网络请求调用 因此 我不希望第二个以上请求访问数据库 而是等到第一个请求访问数据库 我应该重构它以使用Lazy
  • 如果在 Woocommerce 中购买了特定产品,则会向特定地址发送电子邮件通知

    我在我的 WordPress 网站中使用 woocommerce 插件 我想知道如何向特定地址电子邮件发送电子邮件通知 如果产品A由客户购买 在 Woocommerce 中购买特定产品时如何向特定地址发送电子邮件通知 当在订单项中找到特定定
  • 添加新字段或更改所有 Firestore 文档的结构

    考虑一个集合users 集合中的每个文档都有name and email作为字段 users uid1 name Alex Saveau email email protected cdn cgi l email protection ui