当前位置: 首页 > 知识库问答 >
问题:

Firestore onSnapshot文档内嵌套集合

漆雕嘉茂
2023-03-14

我正在尝试与Firebase建立聊天-

我将noSQL数据库的结构如下:

我有一个名为Chats的集合,在那个集合中我有文档,文档的名称代表了2个用户之间的关系哈希也存储在我的SQL数据库中,我的想法是我会用这个作为标识符。

在每个文档中,都有一个名为“对话”的集合,其中将包含两个用户之间的所有聊天。

如果我监听的文档在第一个集合“chats”中有一个特定的id,如果我更改了“timestamp”之类的字段,那么我将在控制台中获得一个日志,以便该部分工作。

db.collection('chats').where(firebase.firestore.FieldPath.documentId(), '==', '#randomHASH').onSnapshot((snapshot) => {
    let changes = snapshot.docChanges();
    console.log('CHANGES');
    console.log(changes);

    changes.forEach(change => {
        console.log(change.doc.data());
    })
});

但我该如何倾听目标文档中的集合“对话”?每次在目标文档中添加或编辑新文档时,我都希望获得一个日志

我试过了,但这似乎不是诀窍。

db.collection('chats').where(firebase.firestore.FieldPath.documentId(), '==', '#randomHASH').collection('conversations').onSnapshot((snapshot) => {
    let changes = snapshot.docChanges();
    console.log('CHANGES');
    console.log(changes);

    changes.forEach(change => {
        console.log(change.doc.data());
    })
});

这就是我发起Firebase的方式

<!-- The core Firebase JS SDK is always required and must be listed first -->
<script src="https://www.gstatic.com/firebasejs/7.1.0/firebase-app.js"></script>

<!-- The core Firebase JS SDK is always required and must be listed first -->
<script src="https://www.gstatic.com/firebasejs/7.1.0/firebase-firestore.js"></script>

<!-- TODO: Add SDKs for Firebase products that you want to use
     https://firebase.google.com/docs/web/setup#available-libraries -->
<script src="https://www.gstatic.com/firebasejs/7.1.0/firebase-analytics.js"></script>

<script>
  // Your web app's Firebase configuration
  var firebaseConfig = {
    apiKey: "xxxxxxxxx",
    authDomain: "myapp-xxxxx.firebaseapp.com",
    databaseURL: "https://myapp.firebaseio.com",
    projectId: "myapp-xxxxx",
    storageBucket: "myapp-xxxxx.appspot.com",
    messagingSenderId: "xxxxxxxxx",
    appId: "1:xxxxx:web:xxxx",
    measurementId: "x-xxxxxx"
  };
  // Initialize Firebase
  firebase.initializeApp(firebaseConfig);
  firebase.analytics();
  const db = firebase.firestore();
</script>

共有1个答案

邹举
2023-03-14

你只需要做:

db.collection('chats').doc('#randomHASH').collection('conversations').onSnapshot((snapshot) => {...});

正如文档中解释的那样,“DocumentResources也可用于创建子集合的ColleAccess。”

实际上,您可以根据需要将集合()doc()方法链接起来,以获取对任何doc或(sub-)(sub-)(...)集合的引用

请注意,同样地,在第一种情况下,您可以:

db.collection('chats').doc('#randomHASH').onSnapshot((snapshot) => {...});

现在,为什么您的代码在第一种情况下有效,而在第二种情况下无效?

在第一种情况下,通过执行db。收藏(“聊天”)。其中(firebase.firestore.FieldPath.documentId(),“==”,“#randomHASH”)定义了一个查询,它确实有一个onSnapshot()方法。

但是在第二种情况下,您在同一个query上调用了集合()方法,而query没有这样的方法

 类似资料:
  • 是否可以在Firestore中查询嵌套文档,而不向方法?我想通过循环所有用户ID并获取所有用户帖子来获取所有用户创建的所有帖子。 下面是我使用的代码。 谢谢。 不会在主机上显示任何内容。在控制台上显示“未来”的实例。 Firestore结构: 帖子 -

  • 我有一个不那么独特的需求,但我只是找到了正确的术语来搜索,因为我只得到如何查询列表/数组字段或嵌套元素的结果。 提前感谢所有的帮助。

  • 问题内容: 我如何在mongodb文档中嵌套文档的地方搜索文档。例如,我有一组私人消息。每条私人消息都有两个嵌套文档- 一个代表发送用户,另一个代表接收使用。两个嵌套文档的格式均为- userID:34343,名称:Joe Bloggs 我希望能够搜索用户发送的所有邮件(例如,搜索发件人用户的嵌套文档)。 我正在使用Java驱动程序。我是否需要创建一个代表嵌套文档的DBObject? 谢谢 问题答

  • 问题内容: 我正在编写资产管理应用程序。它允许用户通过向资产添加html控件(例如文本字段,选择菜单等)来存储任意资产属性。然后,该属性的JSON表示成为存储在beddb中的资产JSON文档的一部分。资产在ouchdb中具有以下结构: 我不确定将属性放入数组是否是允许基于属性值搜索资产的最佳方法。将属性直接附加到资产作为属性会更好吗?我正在用Elasticsearch做实验。如果我尝试按原样存储文

  • 我是elasticsearch的新手,对如何进行过滤器、查询和聚合有一些想法,但不确定如何解决下面的问题。我希望能够从下面显示的文档中只查询公司的最新交付(日期和crate_quantity)。我不确定如何去做。有没有办法使用最大聚合从每个文档中只提取最近的交付?

  • 我想在具有指定 URL 的相应文档中将嵌套的“已爬行”更新为 True。 我对mongodb相当陌生,我似乎无法弄清楚这一点,非常感谢任何帮助。