【问题标题】:How to add a new field to every exiting documents with one click for Flutter app如何一键为 Flutter 应用程序添加新字段到每个现有文档
【发布时间】:2020-11-25 13:53:32
【问题描述】:

我正在开发一个 Flutter 应用程序,我在其中使用流生成器获取云 Firestore,并且工作正常我还实现了一个管理应用程序来创建更多列表数据。问题是我目前正在添加文档字段标题、图像、地址、描述等,但现在我想添加更多字段,例如 location_url。要添加该字段,我必须去 firebase 控制台并手动添加文档字段,这非常痛苦,因为我已经创建了 100 多个文档。如果我没有将该 location_url 字段添加到现有文档,则客户端应用程序会显示错误。所以,请有人告诉我如何一键为每个现有文档添加一个新字段。

【问题讨论】:

  • 其实没有直接的方法可以改变所有的文件。但是在您的颤振客户端中,如果无法从传入文档中读取新字段,只需将新字段设置为默认值,您就可以表现得更优雅,您是如何在 firebase 客户端中解析 json 数据的?

标签: flutter google-cloud-firestore


【解决方案1】:

我明白你的意思,我也遇到过这种情况!!

看,当您向 cloud firestore 添加一组字段时,cloud firestore 会自动生成一个 id 并构造您在该 doc 或 id 中添加的字段。如您所说,自动添加另一个字段是不可能的,因为您必须为 firebase 提供文档 ID 才能知道在哪里添加该字段。

很遗憾,您无法实现所需的功能。唯一的解决方案是手动添加缺少的字段。

或者您可以在客户端应用程序中使用硬编码值来避免该问题,但我认为这对您没有任何帮助。

【讨论】:

    【解决方案2】:

    在使用 NoSQL 数据库时,向数据模型中添加新字段、文档或集合是很常见的。因此,必须处理旧模式的现有数据也是一个常见问题。

    在这些情况下,您拥有的是更改前的数据模型/模式和更改后的数据模型/模式。而且您必须确保您的应用程序能够处理更改,也称为架构迁移。

    有两种常见的方法:

    1. 确保您的客户端代码可以处理新数据的缺失。
    2. 更新现有数据以符合新架构。

    这两种方法都不比另一种更好,事实上:您会经常将两者结合使用。

    更新现有数据以符合新架构有时称为回填数据,尤其是当您(如您在此处所说)在新架构中添加更多数据时。

    我通常会在我的应用程序本身或为此目的编写的小型 Node.js 脚本中为此类回填操作编写一个快速帮助函数。如果我在应用程序本身中编写代码,我永远不会将其发送给我的用户:代码只是让我运行一次或两次,然后我再次将其删除。

    一般/另外,最好确保您的客户端代码可以处理新数据的缺失,因为对于无模式数据库,更常见的是遇到不存在的数据t 遵守您的架构。

    例如,在这种情况下,当您第一次从文档中读取新字段时,您可以轻松地为代码中的新字段设置默认值:var value = document['location_url'] ?? 'default value'

    【讨论】:

      【解决方案3】:

      我创建了一个 python 脚本 cli,用于使用单个命令将新字段添加到集合的所有文档中。

      这里是回购。

      https://github.com/shubham-chhimpa/fire-script-cli

      【讨论】:

        【解决方案4】:

        我处理这种情况的方法是使用转换器。 Firebase 让您能够将数据与 firebase 本身相互转换。有关我的信息,请参阅enter link description here

        【讨论】:

          【解决方案5】:

          感谢您的所有回答。我想我解决了这个问题。我将使用 location_url 功能更新应用程序,并添加一个可编辑按钮以通过管理应用程序编辑缺少的字段。关于现有列表的错误屏幕没有 location_url 字段,但我在下面添加了此代码。

          final universities = snapshot.data.documents[index];
                              final String name = universities["name"];
                              final String address = universities["address"];
                              final String govtprivat = universities["govtprivat"];
                              final String url = universities["url"];
                              final String location_url = universities["location_url"];
          

          对于其中一个字段将被删除或不可用,我添加此代码。

          title: Text(name==null? 'Name':name,
                                            style: TextStyle(
                                                fontSize: 18,
                                                fontWeight: FontWeight.bold),
                                            maxLines: 1,
                                          ),
                                          subtitle: Text(
                                            address==null? 'Address not available':address,
                                            style: TextStyle(fontSize: 16),
                                            maxLines: 1,
                                          ),
          

          我希望我能很好地解决这个问题......

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-08-19
            • 1970-01-01
            • 1970-01-01
            • 2023-02-14
            • 2013-10-26
            • 2021-08-19
            • 1970-01-01
            • 2020-07-04
            相关资源
            最近更新 更多