在新的子集合中创建带有自定义ID的新文档

时间:2020-02-20 15:54:49

标签: python-3.x google-cloud-firestore

我有一个名为Inbox的集合,其中包含多个文档。我正在尝试在其中一个inbox_documents的新firestore子集合中创建一个新文档。新文档应具有一个自定义ID,在这里称为folder_id。我的代码如下:

# Get the correct inbox document reference.
inbox_ref = fs_client.collection(u'inbox').document(self.inbox_id)
if not inbox_ref.get().exists:
    raise ValueError("Referenced inbox does not exist.")

# Make a new document in the model collection and update it
# with the provided folder dictionary.
doc = inbox_ref.collection(u'folder').document(folder_id)
doc.set(folder_dict)

现在根据发现的文档here,我可以简单地将数据分配给集合中的文档。如果(子)集合不存在,Firestore应该自动为我创建它。 在this页面上,我找到了一个代码片段,该代码片段完全符合我想要完成的工作。

使用set()创建文档时,必须为要创建的文档指定ID。例如:

db.collection(u'cities').document(u'new-city-id').set(data)

它与我的代码几乎相同。但是由于某些原因,当我尝试运行代码时,出现以下 ValueError:文档必须具有偶数个路径元素。 我在线搜索了此错误,发现当提供的路径长度错误时,将引发此错误。但是我的道路似乎是正确的。

当我不给文档提供自定义ID时,只要让Firestore使用以下代码自动创建它,那么代码就可以工作,但显然使用自动生成的ID代替了我所需的自定义ID。

doc = inbox_ref.collection(u'folder').document()
doc.set(folder_dict)

我也尝试使用create()代替set(),但是没有运气。 我使用的是google-cloud-firestore python软件包,版本1.6.2。

关于我接下来可以尝试什么或我在做什么错的任何建议?

2 个答案:

答案 0 :(得分:0)

根据您显示的内容,input1.transform.Find("Text").GetComponentInChildren<TMP_InputField>().text = source; 的值几乎可以肯定不是您所期望的。听起来您传递了一个空字符串。您应该使用日志语句或调试器来验证您是否确实在传递期望的值。

答案 1 :(得分:0)

文档ID不允许包含/,这就是失败的原因,并给出了我的路径元素不均匀的错误。通过自动生成ID并在文档中为“真实” ID留有额外字段来解决此问题。