使用 Javascript 在 Firestore 中存储嵌套集合
Posted
技术标签:
【中文标题】使用 Javascript 在 Firestore 中存储嵌套集合【英文标题】:Storing nested collections in Firestore using Javascript 【发布时间】:2019-10-01 21:36:10 【问题描述】:我正在使用 Firebase 和 Firestore 构建一个简单的聊天应用程序。我脑海中的伪模式是这样的:
• threads: collection
|
+---- • friend_id: str
• last_messaged: timestamp
• messages: collection
|
+---- • sender_id: str
• text: str
• timestamp: timestamp
现在,假设我的 id 为 420
的朋友第一次给我发消息。我想通过创建一个新线程来存储这些数据。假设我使用以下命令执行此操作:
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var db = admin.firestore();
var thread_id = '212';
var message_id = '3498213712';
db.collection('threads').add(
id: thread_id,
friend_id: '420',
last_messaged: 1557862539,
messages: [
id: message_id,
sender_id: '420',
text: 'Hello',
timestamp: 1557862539
]
)
这是正确的做事方式吗?由于我在该字段中发送 JSON 对象,是否会自动创建一个名为 messages
的集合?如果没有,我该如何以正确的方式做到这一点?
编辑:也许我之前不够清楚。我希望messages
成为sub-collection
。根据下面的评论,现在它是一个数组。
EDIT2:threads
id 和 messages
都不是随机的。更新代码以反映这一点。
NOT DUPLICATE:不与 cmets 中链接的问题重复,因为该问题针对 Java 和 android SDK,而此问题针对 javascript。
【问题讨论】:
这将在线程文档上创建一个数组字段。 @Herohtar - 请你写一个答案解释如何? 您提出的解决方案有什么问题?有什么事情没有按照您的预期工作吗? @DougStevenson 我在架构中特别提到messages
必须是一个集合。我写的代码根据Herothar的评论创建了一个数组字段。
How to add subcollection to a document in Firebase Cloud Firestore的可能重复
【参考方案1】:
您应该构建对文档的引用,然后在该引用上使用 set()
而不是 add()
创建其内容(因为 add 总是会创建一个新的随机文档 ID)。这在documentation 中有详细说明,我强烈建议您学习它以了解 Firestore 的工作原理。你会经常使用这些信息。
在***文档中创建具有已知 ID(在变量 thread_id
中)的文档:
db.collection('threads').doc(thread_id).set(
friend_id: '420',
last_messaged: 1557862539
)
要在子集合中创建具有已知 ID 的文档,完全一样,只是您必须将子集合的名称放在文档引用的路径中:
db.collection('threads').doc(thread_id).collection('messages').doc(message_id).set(
sender_id: '420',
text: 'Hello',
timestamp: 1557862539
)
【讨论】:
谢谢。有没有办法让整个过程原子化? 阅读批量写入。 firebase.google.com/docs/firestore/manage-data/transactions以上是关于使用 Javascript 在 Firestore 中存储嵌套集合的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Javascript 在 Cloud Firestore 中创建集合?
嵌套的 Javascript 承诺 - 从 Firestore 获取数据
Firebase Firestore从数组Javascript查询
将 Firestore 文档作为纯 Javascript 对象获取?