存储在子集合中的firestore数据

时间:2017-10-24 07:52:15

标签: android firebase google-cloud-firestore

我正在Firestore中制作一个“聊天演示”来保存我正在这样做的消息:

FirebaseFirestore.getInstance()
    .collection(Consts.R_CHAT_ROOM)
    .document(finalChatRoom)
    .collection("messages")
    .document(currentTime)
    .set(chatModel);

但问题是finalChatRoom文档显示它不存在,尽管它包含一个子集合。

database screenshot

正如它在那里写的那样:“这个文档不存在”,尽管它包含一个名为messages的子集合,其中包含更多文档。

但我需要检查chatRoomsMessages集合下是否有特定名称的文件。

我的代码有问题,还是需要以其他方式进行?

提前致谢。

1 个答案:

答案 0 :(得分:3)

在不存在的文档中创建子集合与创建带有子集合的文档然后删除文档非常相似。从Subcollections section of the Data Model documentation这意味着:

  

删除具有关联子集的文档时,不会删除子集。它们仍可通过参考访问。例如,即使db.collection('coll').doc('doc').collection('subcoll').doc('subdoc')引用的文档不再存在,也可能有db.collection('coll').doc('doc')引用的文档。

如果您希望文档存在,我建议首先创建finalChatRoom文档,至少包含一个字段,然后在其下创建子集合。例如:

DocumentReference chatRoomDocument = FirebaseFirestore.getInstance()
        .collection(Consts.R_CHAT_ROOM)
        .document(finalChatRoom);

// Create the chat room document
ChatRoom chatRoomModel = new ChatRoom("Chat Room 1");
chatRoomDocument.set(chatRoomModel);

// Create the messages subcollection with a new document
chatRoomDocument.collection("messages")
        .document(currentTime).set(chatModel);

ChatRoom类的位置如下:

public class ChatRoom {
    private String name;

    public ChatRoom() {}

    public ChatRoom(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // ...
}

这是利用custom objects functionality of Firestore。如果您不想在此阶段使用自定义对象,则可以创建一个简单的Map代替聊天室:

Map<String, Object> chatRoomModel = new HashMap<>();
chatRoomModel.put("name", "Chat Room 1");