【问题标题】:Uploading a Json object array to Firestore将 Json 对象数组上传到 Firestore
【发布时间】:2021-08-08 19:44:52
【问题描述】:

我有一个有序但大的 Json 对象数组,它遵循这个结构:

{
   "object1":[
      {
         "data1":19.77,
         "data2":-0.953125,
         "data3":-0.265625,
         "id":17231,
         "date":"2021-05-14/08:38:47.471"
      },
      {
         "data1":19.77,
         "data2":-0.953125,
         "data3":-0.265625,
         "id":17231,
         "date":"2021-05-14/08:38:47.596"
      },
      {
         "data1":19.77,
         "data2":-0.9609375,
         "data3":-0.2734375,
         "id":17231,
         "date":"2021-05-14/08:38:47.721"
      }
   ],
   "object2":[
      {
         "data1":19.91,
         "data2":-0.9765625,
         "data3":-0.109375,
         "id":18996,
         "date":"2021-05-14/08:38:47.681"
      },
      {
         "data1":19.91,
         "data2":-0.9765625,
         "data3":-0.109375,
         "id":18996,
         "date":"2021-05-14/08:38:47.806"
      },
      {
         "data1":19.91,
         "data2":-1,
         "data3":-0.1171875,
         "id":18996,
         "date":"2021-05-14/08:38:47.931"
      },
      {
         "data1":19.91,
         "data2":-0.96875,
         "data3":-0.1015625,
         "id":18997,
         "date":"2021-05-14/08:38:48.051"
      },
      {
         "data1":19.91,
         "data2":-0.96875,
         "data3":-0.1015625,
         "id":18997,
         "date":"2021-05-14/08:38:48.059"
      },
      {
         "data1":19.91,
         "data2":-0.9765625,
         "data3":-0.109375,
         "id":18997,
         "date":"2021-05-14/08:38:48.176"
      }
   ]
}

我一直在尝试将其上传到 Firebase,但没有成功,尝试在 Firestore 中遵循此架构:

Objects
    ├───Object1
    │   ├───[Upload Timestamp]
    │   │   └───Data Array 1
    │   ├───[Upload Timestamp]
    │   │   └───Data Array 2
    │   └───[Upload Timestamp]
    │       └───Data Array 3
    └───Object2
        ├───[Upload Timestamp]
        │   └───Data Array 1
        ├───[Upload Timestamp]
        │   └───Data Array 2
        ├───[Upload Timestamp]
        │   └───Data Array 3
        ├───[Upload Timestamp]
        │   └───Data Array 4
        ├───[Upload Timestamp]
        │   └───Data Array 5
        └───[Upload Timestamp]
            └───Data Array 6

我尝试使用嵌套的 For 循环、字典等来做到这一点,但没有成功。到目前为止,我只能将每个对象的最后一个 Data Array 上传到 Firestore。

有什么方法可以将它正确上传到 Firestore 吗?

编辑:添加有关我的代码的更多信息

我有什么:

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import json
from itertools import groupby
import datetime
from datetime import date

today = date.today()
d1 = today.strftime("%d.%m.%Y")

json_file_path = "./myfile.json" 

with open(json_file_path, 'r') as j:
    contents = json.loads(j.read())
data = {}
#Sorting my json file
for key, items in groupby(sorted(contents, key = lambda x: (x['id'], x['date'])), key=lambda x: x['id']):  
    data[key] = list(items)

cred = credentials.Certificate("myAppCreds.json")

firebase_admin.initialize_app(cred, {
'projectId': "MyProjectID",
})

db = firestore.client()

for keys in data:
    doc_ref = db.collection('Objects').document(keys).collection(d1).document(str(datetime.datetime.now()))
    for info in data[keys]:
        doc_ref.set(keys)

会发生什么:

在 Firestore 中创建了以下条目:

Objects/object1/19.05.2021/2021-05-19 13:26:03.933868

文档“2021-05-19 13:26:03.933868”会不断更新新值,而不是为每个新值创建一个新值。 object2 也是如此

【问题讨论】:

  • 您的时间戳对于对象数组中的每条记录都是唯一的,因此每个 [Upload Timestamp] 下只有一个叶子。
  • 你是对的,我编辑了这个问题。谢谢。
  • 我不熟悉界面,但我已经设法使用您的对象架构在管理员上创建了一个对象。我将如何测试上传?
  • 基本上你需要在每个object节点内定义一个地图数组。
  • 请使用无效的上传代码编辑您的问题。

标签: python json python-3.x google-cloud-firestore firebase-admin


【解决方案1】:

这是一份工作草案,附有一些评论:

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import json
from datetime import date

today = date.today()
d1 = today.strftime("%d.%m.%Y")

json_file_path = "./myfile.json" 

with open(json_file_path, 'r') as j:
    contents = json.loads(j.read())

# 1. This will be the criteria to sort each inner list
# first by ID, then by date, ascending
def _sort(item):
    return (item['id'], item['date'])

# 2. Sorting my json file lists, in place
for lista in contents.values():
    lista.sort(key=_sort)

cred = credentials.Certificate("myAppCreds.json")

firebase_admin.initialize_app(cred, {
'projectId': "MyProjectID",
})    

db = firestore.client()

# Inside the collection Objects, I create a document for each object key,
# Then set the inner list as an inner document, with value equals to the list.
for key, lista in contents.items():
    doc_ref = db.document('Objects/' + key).set({'lista': lista})

这不会绝对按 id/date 排序,因为对象是单独排序的。您可能需要调整它。

在 firebase 中,我已成功创建运行此代码的文档。

【讨论】:

    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多