如何在 Firebase Cloud Firestore 中向文档添加子集合

该文档不包含有关如何向文档添加子集合的任何示例。我知道如何将文档添加到集合以及如何向文档添加数据,但是如何将集合(子集合)添加到文档?

不应该有这样的方法吗:

dbRef.document("example").addCollection("subCollection")

答案 1

编辑13 Jan 2021:

根据有关数组成员资格的更新文档,现在可以使用方法根据数组值筛选数据。一个简单的例子是:whereArrayContains()

CollectionReference citiesRef = db.collection("cities");
citiesRef.whereArrayContains("regions", "west_coast");

此查询返回每个城市文档,其中 regions 字段是包含west_coast的数组。如果数组具有您查询的值的多个实例,则该文档仅在结果中包含一次。


假设我们有一个聊天应用程序,其数据库结构类似于以下内容:

enter image description here

要在文档中编写,请使用以下代码:subCollection

DocumentReference messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1");

如果你想创建集合并调用1000次肯定会很昂贵,但这就是Firestore的工作方式。如果需要,您可以切换到 Firebase 实时数据库,其中写入次数无关紧要。但是关于Firestore中支持的数据类型,实际上,您可以使用数组,因为它是受支持的。在 Firebase 实时数据库中,您也可以使用 ,但这是一种反模式。Firebase 建议不要使用数组的众多原因之一是,它使安全规则无法编写。messagesaddDocument()array

Cloud Firestore可以存储数组,它不支持查询数组成员或更新单个数组元素。但是,您仍然可以通过利用 Cloud Firestore 的其他功能对此类数据进行建模。这是解释得很好的文档。

也不能创建包含 1000 条消息的子集合,然后将所有这些消息添加到数据库中,同时考虑单个记录。对于每条消息,它将被视为一个写入操作。总共 1000 次操作。上图没有显示如何检索数据,它显示了一个数据库结构,其中您具有如下内容:

collection -> document -> subCollection -> document

答案 2

下面是一个变体,其中子集合在集合级别存储 ID 值,而不是在文档中存储子集合是包含其他数据的字段。

这对于连接一对多 ID 映射非常有用,而不必钻取其他文档:

function fireAddStudentToClassroom(studentUserId, classroomId) {

    var db = firebase.firestore();
    var studentsClassroomRef =
        db.collection('student_class').doc(classroomId)
          .collection('students');

    studentsClassroomRef
        .doc(studentUserId)
        .set({})
        .then(function () {
            console.log('Document Added ');
        })
        .catch(function (error) {
            console.error('Error adding document: ', error);
        });
}

感谢@Alex的回答

这个答案与此处的原始问题略有不同,在原始问题中,它明确要求向文档添加集合。但是,在搜索了这种情况的解决方案并且没有在文档或SO上找到任何提及之后,这篇文章似乎是分享调查结果的合理场所


推荐