62

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

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

4

11 回答 11

35

我刚刚为 Firestore 写了一个备份和恢复。你可以在我的 GitHub 上试试。

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

谢谢,

于 2018-01-17T17:39:13.290 回答
32

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

更新

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

于 2017-10-07T13:16:51.003 回答
21

谷歌让它变得比它需要的更难,所以社区找到了一个解决方法。如果你已经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

资源

于 2020-07-03T15:20:14.880 回答
14

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

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

于 2018-03-09T20:59:47.230 回答
10

如果有人想要使用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)
于 2018-11-09T12:49:22.550 回答
3

Firestore 仍处于早期开发阶段,因此请查看备份文档以获取与 Firestore 有关的任何信息。

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

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

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

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

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

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

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

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

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

于 2021-03-11T10:40:48.340 回答
2

这个对我有用。

我使用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你会看到这样的东西

在此处输入图像描述

于 2020-11-17T10:56:53.157 回答
2

是的,您可以,您无需在 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');

})

});

执行 node 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 中填充了集合用户!

于 2021-05-13T05:58:27.693 回答
1
  1. 创建一个空白文件夹(称为firebaseImportExport)并运行npm init
  2. 转到源 Firebase 项目 -> 设置 -> 服务帐户
  3. 单击Generate new private key按钮并将文件重命名为 source.json 并将其放在firebaseImportExport文件夹中
  4. 对目标项目执行相同的操作(步骤 2 和 3)并将文件重命名为 destination.json
  5. 安装npm i firebase-adminnpm 包。
  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()});
        });
    });
   });

于 2019-04-18T10:20:07.510 回答
0

打开您的任何客户端 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-09-12T06:12:40.270 回答