使用 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。根据下面的评论,现在它是一个数组。

EDIT2threads 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 对象获取?

如何在 Firestore 中正确使用 arrayUnion?

javascript Firestore:transacciones