如何在Firestore中向现有数组添加非唯一元素?

时间:2019-08-21 17:40:07

标签: python firebase google-cloud-firestore time-series

我正在使用Firestore存储从传感器提取的时间序列数据。我正在使用Python推送数据,即用于验证的Firebase-Admin程序包。我选择使用数组存储此数据,其中每个索引对应于跨不同字段的数组。有没有一种方法可以将非唯一元素添加到数组?还是数组只能存储唯一元素?如果是这样,您建议使用什么数据结构来存储时间序列数据。

我试图将观测值添加到Firestore中的现有阵列,但是ArrayUpdate仅在该元素尚不存在时才添加该元素。当我执行第二次代码检查(以更新现有数组)时,仅保存唯一值

# Initialize arrays and push to Firestore
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import datetime

cred = credentials.Certificate('path_to_certificate')

firebase_admin.initialize_app(cred)
db = firestore.client()
cell_1_arr = []
cell_2_arr = []
cell_3_arr = []
exec_time_arr = []
curr_time_arr = []
pred_volt = 12562.70
meas_volt = 12362.70
current = 0.0
soc = 0,0
cell_1_volt = 4.32
cell_2_volt = 4.4
cell_3_volt = 4.23
exec_time = 0.4
curr_time = datetime.datetime.now()
pred_v_arr.append(pred_volt)
meas_v_arr.append(meas_volt)
c_arr.append(current)
soc_arr.append(soc)
cell_1_arr.append(cell_1_volt)
cell_2_arr.append(cell_2_volt)
cell_3_arr.append(cell_3_volt)
exec_time_arr.append(exec_time)
curr_time_arr.append(curr_time)

try:
    push_data = {
        u'time': curr_time_arr,
        u'vpred': meas_v_arr,
        u'vmeas': pred_v_arr,
        u'current': c_arr,
        u'soc': soc_arr,
        u'cell1': cell_1_arr,
        u'cell2': cell_2_arr,
        u'cell3': cell_3_arr,
        u'exectime': exec_time_arr
    }
    db.collection(u'battery1').document(u"day1").set(push_data)

# Add add a new observation to the different arrays
db.collection(u'battery1').document(u"day1").update({'time': firestore.ArrayUnion(curr_time_arr)})
db.collection(u'battery1').document(u"day1").update({'vpred': firestore.ArrayUnion(pred_v_arr)})
db.collection(u'battery1').document(u"day1").update({'vmeas': firestore.ArrayUnion(meas_v_arr)})
db.collection(u'battery1').document(u"day1").update({'current': firestore.ArrayUnion(c_arr)})
db.collection(u'battery1').document(u"day1").update({'cell1': firestore.ArrayUnion(cell_1_arr)})
db.collection(u'battery1').document(u"day1").update({'cell2': firestore.ArrayUnion(cell_2_arr)})
db.collection(u'battery1').document(u"day1").update({'cell3': firestore.ArrayUnion(cell_3_arr)})
db.collection(u'battery1').document(u"day1").update({'exectime': firestore.ArrayUnion(exec_time_arr)})
db.collection(u'battery1').document(u"day1").update({'soc': firestore.ArrayUnion(soc_arr)})

firestore screenshot 1

在上面的屏幕截图中,您可以看到“时间”字段中有8个元素(因为对datetime.now()的所有调用都会生成唯一的时间戳实例),而所有其他字段仅保存了唯一的数据点发送(exectime / soc只有两个数据点,用于ArrayUnion的8次调用)。

1 个答案:

答案 0 :(得分:1)

使用firestore.ArrayUnion时,该运算符的工作实际上是为了确保每个值在数组中只能出现一次。

如果要允许非唯一值,请不要使用firestore.ArrayUnion,而要定期将元素添加到数组中。这确实需要您先阅读整个文档和数组,然后在本地添加元素,然后将结果写回。