【问题标题】:Firestore: How to update array on a condition and nested arrayFirestore:如何根据条件和嵌套数组更新数组
【发布时间】:2021-01-18 08:04:41
【问题描述】:

Image of database 我似乎无法根据条件修改 convos 数组,更不用说更新嵌套值了。 我想做的两件事: 给定 socketID 将“已连接”更改为 false。 给定 socketID 的消息数组中添加一个对象。 我可以添加到 convos 数组中并从 convos 数组中读取,但我无法更新或更改任何内容。

下面是我认为是我最好的尝试的代码

const person = {socketID: '123123'};
firebase.firestore().collection("Conversations").doc("x0uio6wWlxEyos6ruc2r")
        .onSnapshot((doc)=> {
          doc.where('socketID', '===', person.socketID)
          .update({
            connected: false
          })
        })

我认为,如果我正确知道如何访问特定文档中的 convos 数组,那么我应该能够相应地进行更新更改。 非常感谢任何帮助。

【问题讨论】:

  • socketId 对于所有记录来说是唯一的吗?如果不是 where 条件匹配多个文档。你应该使用批处理等更新它们。
  • 是的,所有的socketID都是唯一的
  • onSnapshot 对于这种方法是强制性的?
  • 我不这么认为。但我能够使用 onSnapshot 访问我的文档并从 convos 数组中检索所有数据。

标签: javascript node.js reactjs google-cloud-firestore


【解决方案1】:

试试这个,

update({
  connected : false,
  messages : firebase.firestore.FieldValue.arrayUnion(object)
})

要删除元素,请使用arrayRemove

【讨论】:

  • 感谢您的回复。给定数据库的设置方式,如何添加条件。条件为指定的 socketID。
【解决方案2】:

您不能对 DocumentData 应用过滤。您可能需要通过 javascript 操作文档。

const data = (await firebase.firestore().collection("Conversations").doc("x0uio6wWlxEyos6ruc2r").get()).data();
const manipulatedData = data.find(x => x.socketID == person.socketID).connected = false;     
firebase.firestore().collection("Conversations").doc("x0uio6wWlxEyos6ruc2r").set(manipulatedData, { merge: true });

您可能需要对代码进行一些小改动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 2020-12-27
    • 1970-01-01
    • 2023-03-07
    • 2019-06-08
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多