如何更新 Firestore 文档中的集合?

问题描述 投票:0回答:1

我正在尝试在用户和我之间创建聊天,以实现客户支持目的,为此,我希望登录用户可以转到联系页面,他们可以输入消息并点击发送,这将更新新的消息包含他们的消息以及时间戳的文档。

  setup(){
      const { Chat, error, load } = getChat();
      load();
    const message = ref('')
    const Activate = ref(false)
    const handleSubmit = async () => {  
    const NewChat = {
        message: message.value,
        createdAt: timestamp(),
    }
    const res = await projectFirestore.collection('Subscribed').doc(firebaseAuth.currentUser.uid).collection('messages').doc().update(NewChat)
  }
  return { handleSubmit, Activate, message, Chat, load }
}

正如您在上面看到的,我希望更新的位置位于具有用户 UID 的文档内的“订阅”集合内,然后位于“消息”集合内,我想在其中添加一个新文档消息以及每次键入和发送消息时其中的 UID。

我遇到的错误是

enter image description here

我不明白为什么会发生这种情况,因为我之前已经做过类似的其他更新,唯一的区别是更新发生在 UID 文档内部,而且我不必深入到下一个集合,所以我认为问题出在文档中的集合。我在检索消息集合中的数据以显示消息时也遇到了类似的问题,但我可以通过将以下代码写入 JavaScript 文档,然后将数据导入到消息页面来解决此问题。

import { projectFirestore } from "../Firebase/Config";
import { ref } from "vue"
import { firebaseAuth } from "../Firebase/firebase";

const getChat = () => {
    const Chat = ref([])
    const error = ref(null)
    let lastDoc = null; 

    const load = async () => {
        try {
            let query = projectFirestore.collection('Subscribed').doc(firebaseAuth.currentUser.uid).collection('messages').orderBy('createdAt')
            if (lastDoc) {
                query = query.startAfter(lastDoc)
            }

            const res = await query.get()

            if (!res.empty) {
                lastDoc = res.docs[res.docs.length - 1]

                // Add new results to exsiting ones

                Chat.value = [...Chat.value, ...res.docs.map(doc => {
                  //  console.log(doc.data())
                    return {...doc.data(), id: doc.id}
                })]
            }
        }
        catch (err){
            error.value = err.message
           // console.log(error.value)
        }
    }

    return { Chat, error, load }
}

export default getChat

然后,我能够在导入消息的页面上成功显示消息集合消息,但我无法在此处进行更新,因为我不追求集合中的内容,但我需要指定要更新的路径收藏里面。

我确实需要将文档添加到消息集合中。 有谁知道如何使此更新功能起作用并更新文档内的消息集合?

javascript firebase google-cloud-firestore
1个回答
0
投票

这永远行不通:

....collection('messages').doc().update(NewChat)
。调用
doc()
(不带任何参数)会创建对新的、不存在的文档的引用,并且您只能为现有文档调用
update
。问题是您想要在
messages
集合中更新什么。

如果您想向

messages
集合添加新的消息文档,您可以通过调用
add
:

来实现
...collection('messages').add(NewChat)

我建议将 Firebase 文档放在手边,因为这在“将文档添加到集合”部分中进行了介绍。

© www.soinside.com 2019 - 2024. All rights reserved.