Python上用于子集合的Firebase云Firestore onSnapshot

2024-06-26 14:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

【更新】我正在编写以下python代码。 作为预设,Cloud Firestore中只有2个用户

def on_snapshot(doc_snapshot, changes, read_time):

    user_counter = 0
    for doc in doc_snapshot:
        print('user %s' %(user_counter))
        user_counter +=1


while_counter=0
while True:
    print('while %s ----------' %(while_counter))
    while_counter+=1

    time.sleep(1) #Sleep for X seconds

    #doc_ref = db.collection(u'users').document(doc.id)
    doc_ref = db.collection(u'users')    # Watch the document
    doc_watch = doc_ref.on_snapshot(on_snapshot)

终端显示如下输出:

while 0 ----------
while 1 ----------
user 0
user 1
while 2 ----------
user 0
user 1
while 3 ----------
user 0
user 1
while 4 ----------
user 0
user 1
while 5 ----------
user 0
user 1
user 0user 0
user 1

user 0
user 1
user 1
user 0
user 1
user 0
user 1
while 6 ----------
user 0
user 1
while 7 ----------
user 0
user 1
while 8 ----------
user 0
user 1
user 0
user 1
user 0
user 1
user 0
user 1
user 0
user 1
user 0
user 1
user 0
user 1
user 0
user 1
user 0
user 1
while 9 ----------
user 0
user 1
while 10 ----------
user 0
user 1

虽然我认为输出应该是这样的

while 0 ----------
user 0
user 1
while 1 ----------
user 0
user 1
while 2 ----------
user 0
user 1
while 3 ----------
user 0
user 1
while 4 ----------
user 0
user 1
while 5 ----------
user 0
user 1
while 6 ----------
user 0
user 1
while 7 ----------
user 0
user 1
while 8 ----------
user 0
user 1
while 9 ----------
user 0
user 1
while 10 ----------
user 0
user 1

我在这个问题上纠缠了一段时间。 如果有人能找到并告诉我一个解决方案,我将不胜感激。 多谢各位


【本期过往帖子】 我正在编写下面的python代码

def on_snapshot(doc_snapshot, changes, read_time):
    user_counter = 0
    for doc in doc_snapshot:
        print('user_counter: %s' %(user_counter))
        user_counter +=1

        sub_docs = db.collection(u'users').document(doc.id).collection(u'history').where(u'flag', u'==', True).stream()

        subdoc_counter = 0
        for sub_doc in sub_docs:
            print('subdoc_counter: %s' %(subdoc_counter))
            subdoc_counter +=1

            print('Generating...')
            sub_doc_dict = sub_doc.to_dict()
            usr_txt = sub_doc_dict['inputdata']

            #doing something for updating usr_text, here.

            db.collection(u'users').document(doc.id).collection(u'history').document(sub_doc.id).set({
                u'outputdata': usr_txt,
                u'flag': False
            }, merge=True)

            #break #This didn't work I expected.


doc_ref = db.collection(u'users')
while_counter=0
while True:
    doc_watch = doc_ref.on_snapshot(on_snapshot)

    print('while_counter: %s' %(while_counter))
    while_counter+=1

    time.sleep(1)

print()的输出如下:

#Actual output of print().
"""
while_counter: 0
user_counter: 0
while_counter: 1
user_counter: 0
user_counter: 1
user_counter: 1
while_counter: 2
user_counter: 0
user_counter: 1
.
.
.

while_counter: 12
user_counter: 1
user_counter: 1
user_counter: 1
user_counter: 1
user_counter: 1
user_counter: 1
user_counter: 0
subdoc_counter: 0
Generating...
subdoc_counter: 0
Generating...
user_counter: 1
subdoc_counter: 0
Generating...
subdoc_counter: 0
Generating...
user_counter: 1
subdoc_counter: 0
Generating...
subdoc_counter: 0while_counter: 13

Generating...
subdoc_counter: 0
Generating...
subdoc_counter: 0
Generating...
user_counter: 1
subdoc_counter: 0
Generating...
subdoc_counter: 0
Generating...
subdoc_counter: 0
Generating...subdoc_counter: 0
Generating...

user_counter: 0
user_counter: 1
while_counter: 14
user_counter: 0
user_counter: 1
while_counter: 15
user_counter: 0
user_counter: 1
"""

虽然我认为它应该显示如下

#Output of my thought.
"""
while_counter: 0
user_counter: 0
user_counter: 1
while_counter: 1
user_counter: 0
user_counter: 1
while_counter: 2
user_counter: 0
user_counter: 1
.
.
.

while_counter: 12
user_counter: 0
subdoc_counter: 0
Generating...
user_counter: 1
while_counter: 13
user_counter: 0
user_counter: 1
.
.
.
"""

我不知道为什么我的代码多次运行print('Generating…')。以及如何修改它。 这个云Firestore为每个用户都有一个子集合“历史记录”(现在只有两个用户)。 在“历史”中,有历史数据,如history1、history2。 在每个历史数据中,有三个值:flag、inputdata和outputdata。 当打开标志(=True)时,从inputdata只生成一次outputdata(当启动此python代码时,所有标志都为False)。 并且在用户的子集合中,只有一个(或零个)历史数据同时具有flag=True

你有没有找到让这段代码像“我的想法的输出”一样运行的解决方案? 先谢谢你


Tags: 代码reftruefordbdoconcounter