【问题标题】:Export json from Firestore从 Firestore 导出 json
【发布时间】:2018-03-18 23:33:24
【问题描述】:

由于我们可以在 Firebase RTDB 控制台下载 json 文件,有没有办法导出 Firestore 集合/文档数据的 json 文件?

我的主要目标之一是比较更新文档前后的数据。

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    我刚刚为 Firestore 编写了备份和恢复。您可以在我的 GitHub 上尝试一下。

    https://github.com/dalenguyen/firestore-backup-restore

    谢谢,

    【讨论】:

    • 太棒了?? tysm
    • 这是最简单和最好的解决方案。谢谢
    【解决方案2】:

    没有,您需要提出自己的流程,例如查询集合并循环遍历所有内容。

    更新

    截至 2018 年 8 月 7 日,我们确实有一个 managed export system,可让您将数据转储到 GCS 存储桶中。虽然这不是 JSON,但它是一种与 Cloud Datastore 使用的格式相同的格式,因此 BigQuery 可以理解它。这意味着您可以import it into BigQuery

    【讨论】:

    • 好消息。导入和导出您的 Cloud Firestore 数据。查看blogdoc 了解更多信息
    • @dan-mcgrath 您能否指出有关子集合的任何信息以及如何在 BigQuery 中有效地查询这些信息?
    • 导出的文件是什么格式,怎么能看到内容?
    • 如何将转储导出为 json 格式,有没有办法压缩所有转储文件?
    • 我似乎找不到任何有关 Firestore 导出格式的信息。当我尝试导入导出的 Firestore 文件时,BigQuery 导入 UI 中的所有文件类型选项都会出错。
    【解决方案3】:

    Google 让它变得比需要的更难,因此社区找到了解决方法。如果你安装了npm,你可以这样做:

    导出

    npx -p node-firestore-import-export firestore-export -a credentials.json -b backup.json
    

    导入

    npx -p node-firestore-import-export firestore-import -a credentials.json -b backup.json
    

    Source

    【讨论】:

    • 这是获取 json 格式数据的最简单方法,并且在此日期开始工作。您需要获取 GCP 服务帐户凭据,如 cloud.google.com/docs/authentication/production
      更多文档:npmjs.com/package/firestore-export-import
    • 效果很好,非常感谢!也感谢@ezaspi 的评论:凭据
    • 这个命令很好用,但是在运行这个命令时它算作对 firestore 的读/写吗?
    • @sh_ark 是的,它计入您项目的读/写次数
    • 这太棒了。谢谢!
    【解决方案4】:

    我编写了一个工具,它可以遍历数据库的集合/文档并将所有内容导出到单个 json 文件中。此外,它还将导入相同的结构(有助于克隆/移动 Firestore 数据库)。由于我有几个同事使用该代码,我想我会将它作为 NPM 包发布。随意尝试并提供一些反馈。

    https://www.npmjs.com/package/node-firestore-import-export

    【讨论】:

    • 迄今为止我为此找到的优秀的最佳软件包,尤其是对于多种环境场景非常有用的导入。另外我看到你必须在命令中指定凭证文件的路径,让它首先检查环境变量 GOOGLE_APPLICATION_CREDENTIALS 中的路径是否有用,否则可以通过路径参数覆盖。
    • 我也把它放在我的 package.json 中,这样我就可以运行“npm run firestore-export”或“import”
    • @wchoward 我喜欢环境方法...我会在下一个版本中添加它
    • @wchoward 我在 0.8.0 版中添加了 GOOGLE_APPLICATION_CREDENTIALS 支持...检查一下,让我知道它是否适合您。
    • 如果我导出一个数据量很大的集合,它会出现内存不足错误
    【解决方案5】:

    如果有人想要使用 Python 23 的解决方案。

    编辑:注意这不会备份规则

    https://github.com/RobinManoli/python-firebase-admin-firestore-backup上叉它

    首先安装和设置 Firebase Admin Python SDK:https://firebase.google.com/docs/admin/setup

    然后安装到你的python环境中:

    pip install firebase-admin
    

    安装 Firestore 模块:

    pip install google-cloud-core
    pip install google-cloud-firestore
    

    (来自ImportError: Failed to import the Cloud Firestore library for Python

    Python 代码

    # -*- coding: UTF-8 -*-
    
    import firebase_admin
    from firebase_admin import credentials, firestore
    import json
    
    cred = credentials.Certificate('xxxxx-adminsdk-xxxxx-xxxxxxx.json') # from firebase project settings
    default_app = firebase_admin.initialize_app(cred, {
        'databaseURL' : 'https://xxxxx.firebaseio.com'
    })
    
    db = firebase_admin.firestore.client()
    
    # add your collections manually
    collection_names = ['myFirstCollection', 'mySecondCollection']
    collections = dict()
    dict4json = dict()
    n_documents = 0
    
    for collection in collection_names:
        collections[collection] = db.collection(collection).get()
        dict4json[collection] = {}
        for document in collections[collection]:
            docdict = document.to_dict()
            dict4json[collection][document.id] = docdict
            n_documents += 1
    
    jsonfromdict = json.dumps(dict4json)
    
    path_filename = "/mypath/databases/firestore.json"
    print "Downloaded %d collections, %d documents and now writing %d json characters to %s" % ( len(collection_names), n_documents, len(jsonfromdict), path_filename )
    with open(path_filename, 'w') as the_file:
        the_file.write(jsonfromdict)
    

    【讨论】:

    • 对本地出口非常有用且快速
    【解决方案6】:

    有一个用于 firestore 导出/导入的 npm

    要导出的项目 转到 -> 项目设置 -> 服务帐户 -> 生成新私钥 -> 将其保存为exportedDB.json

    要导入的项目 转到 -> 项目设置 -> 服务帐户 -> 生成新私钥 -> 将其保存为importedDB.json

    从你保存文件的文件夹中运行这两个命令

    导出: npx -p node-firestore-import-export firestore-export -a 导出的DB.json -b backup.json

    导入: npx -p node-firestore-import-export firestore-import -a importDB.json -b backup.json

    【讨论】:

      【解决方案7】:

      Firestore 仍处于早期开发阶段,因此请查看 docs on backups 以了解与 Firestore 相关的任何信息。

      我发现这个 npm 包 node-firestore-backup 既简单又实用。

      请注意,--accountCredentials path/to/credentials/file.json 指的是一个服务帐户密钥 json 文件,您可以按照https://developers.google.com/identity/protocols/application-default-credentials 的说明获取该文件。

      1. 转到 API 控制台凭据页面。
      2. 从项目下拉列表中选择您的项目。
      3. 在凭据页面上,选择创建凭据下拉菜单,然后选择服务帐户密钥。
      4. 从“服务帐户”下拉列表中,选择现有服务帐户或创建一个新帐户。
      5. 对于密钥类型,选择 JSON 密钥选项,然后选择创建。该文件会自动下载到您的计算机上。
      6. 将您刚刚下载的 *.json 文件放在您选择的目录中。这个目录必须是私有的(你不能让任何人访问它),但是你的网络服务器代码可以访问。

      【讨论】:

      • 如果集合数据量很大,则会因内存不足而崩溃
      • 这对于普通数据库来说不是一个好的解决方案。大约 10 万个寄存器已经失败。
      【解决方案8】:

      它对我有用。

      我使用Cloud Functions 将 Firestore 中的所有数据导出为 JSON 格式。我使用的功能:

      exports.exportFirestore2Json = functions.https.onRequest((request, response) => {
          db.collection("data").get().then(function(querySnapshot) {
              const orders = [];
              var order = null
      
               querySnapshot.forEach(doc => {
                   order = doc.data();
                   orders.push(order);
               });
      
               response.send(JSON.stringify(orders))
      
               return true
          })
          .catch(function(error) {
              console.error("Error adding document: ", error);
              return false
          });
      })
      

      然后,去https://your-project-id.cloudfunctions.net/exportFirestore2Json你会看到这样的东西

      【讨论】:

      • 它是否适用于大型数据库(5-10 GB)?
      • @VeereshDevireddy 我还没有测试这个案例。
      【解决方案9】:

      可以,您无需在 Firebase 控制台中开始计费。有一个很棒的 npm 包https://www.npmjs.com/package/firestore-export-import,您可以通过它轻松地导出和导入 Firestore 集合和文档。只需遵循一些步骤:

      -获取您的服务帐户密钥 打开 Firebase 控制台 > 项目设置 > 服务帐户 > 生成新的私钥

      用 serviceAccountKey.json 重命名下载的文件

      -现在创建一个新文件夹和 index.js 文件。

      -将你的 servicekey.json 粘贴到这个文件夹中

      -现在安装这个包

      npm install firestore-export-import
          OR
      yarn add firestore-export-import
      

      从 firebase 导出数据

      const { initializeApp} =  require('firestore-export-import')
      
      const  serviceAccount  =  require('./serviceAccountKey.json')
      
      const  appName  =  '[DEFAULT]'
      
      initializeApp(serviceAccount, appName)
      
      const  fs  =  require('fs');
      
      const { backup } =  require('firestore-export-import')
      //backup('collection name')
      
      backup('users').then((data) =>
      {
          const  json  =  JSON.stringify(data);
      
          //where collection.json is your output file name.
          fs.writeFile('collection.json', json, 'utf8',()=>{
      
          console.log('done');
      
      })
      
      });
      

      执行节点 index.js,您应该会看到一个新的 collection.json 文件,其中包含您的集合和文档。如果它看起来有点凌乱漂亮,请在线格式化 https://codebeautify.org/jsonviewer

      这个 index.js 只是一个非常基本的配置,它可以导出包含所有内容的整个集合,阅读他们的文档,您可以进行查询等等!

      将数据导入 firebase

      const { initializeApp,restore } =  require('firestore-export-import')
      
      const  serviceAccount  =  require('./serviceAccountKey.json')
      const  appName  =  '[DEFAULT]'
      
      initializeApp(serviceAccount, appName)
      restore('collection.json', {
      //where refs is an array of key items
          refs: ['users'],
          //autoParseDates to parse dates if documents have timestamps
          autoParseDates: true,
      
          },()=>{
      
      console.log('done');
      })
      

      执行后,您应该会看到您的 firestore 填充了集合用户!

      【讨论】:

        【解决方案10】:
        1. 创建一个空白文件夹(称为 firebaseImportExport)并运行 npm init
        2. 转到源 Firebase 项目 -> 设置 -> 服务帐户
        3. 点击Generate new private key按钮,将文件重命名为source.json,放到firebaseImportExport文件夹中
        4. 对目标项目执行相同的操作(步骤 2 和 3)并将文件重命名为 destination.json
        5. 安装npm i firebase-admin npm 包。
        6. index.js中编写如下代码
        
        const firebase = require('firebase-admin');
        
        var serviceAccountSource = require("./source.json");
        var serviceAccountDestination = require("./destination.json");
        
        const sourceAdmin = firebase.initializeApp({
            credential: firebase.credential.cert(serviceAccountSource),
            databaseURL: "https://**********.firebaseio.com" // replace with source
        });
        
        const destinationAdmin = firebase.initializeApp({
            credential: firebase.credential.cert(serviceAccountDestination),
            databaseURL: "https://$$$$$.firebaseio.com"
          }, "destination");
        
        const collections = [ "books", "authors",   ...]; // replace with your collections
        
            var source = sourceAdmin.firestore();
            var destination = destinationAdmin.firestore();
           collections.forEach(colName => {
            source.collection(colName).get().then(function(querySnapshot) {
                querySnapshot.forEach(function(doc) {
                    destination.collection(colName).doc(doc.id).set({...doc.data()});
                });
            });
           });
        
        

        【讨论】:

          【解决方案11】:

          打开您的任何客户端 Firebase 应用程序(React、Angular 等)。在任何地方使用此代码来记录控制台并复制

          const products = await db
            .collection("collectionName")
            .where("time", ">", new Date("2020-09-01"))
            .get()
          
          
          const json = JSON.stringify(products.docs.map((doc) => ({ ...doc.data() })))
          console.log(json)
          

          【讨论】:

            猜你喜欢
            • 2020-04-22
            • 1970-01-01
            • 2022-09-28
            • 2018-08-11
            • 2021-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-02
            相关资源
            最近更新 更多