【问题标题】:How to update information from an array to firebase?如何将信息从数组更新到 Firebase?
【发布时间】:2021-12-13 05:29:59
【问题描述】:

我的目标是通过每次“购买”时添加 +1 来更新特定文档,这是数据输入的方式我可以使用这个:

const data = JSON.parse(window.localStorage.getItem("listaLibros"))

在控制台日志中是这样的:

或者我可以将所有数据转换为一个数组(我知道哪种方式更容易实现我想要做的事情,这就是我提到两者的原因)

const allItems = [...data1, ...data2, ...data3]

然后是这样的:

但是,我将它们“分隔”为 4,0,3 的原因是因为每个数组都来自不同的集合,而这次我没有来自第二个集合,这就是它带来 0 的原因。

现在的想法是,对于每本书,它都会在各自的收藏中添加一个 +1 作为“有序”,每本书都有自己的 uid,在这种情况下,它作为 id 添加到文档中,图中的示例之一是 PE例如 -13620。

我如何比较我的数组信息,我认为最好的方法是使用带有单独数组的集合,这样我可以按集合划分它

    let data1 = data[0] //Collection A
    let data2 = data[1] //Collection B
    let data3 = data[2] //Collection C

我知道你可以使用 .where('id', 'array-contains', data[0].id) 我想? 但是我如何使用它来更新每个匹配的?并添加 +1 会像做这样的事情一样简单吗?

.update({
ordered: ++1 
})

更新 1 显示用户在“付款”之前如何从每个集合中选择每条数据的图像

集合 B 并不总是空的,但在本例中是空的。

更新 2

因此,当您在“付费”屏幕中时,之前的 3 个数组合并为 1 个(正如我之前提到的... const allItems = [...data1, ...data2, ...data3])

当这个人要按付款时,我需要知道如何使用数组 data1、data2 和 data3 来检查每本书并更新集合并在“有序”中添加 +1。到目前为止,我做了一个新文档来将所有这些存储到一个订单中,但我还没有弄清楚如何更新这本书在“有序”中的 +1

所以对于订单我执行以下操作:

const docRef = db.collection('usuarios').doc(user.uid).collection('pedidos').doc(docId)
        docRef.get().then((doc) => {
                docRef.set({
                    acudiente: user.displayName,
                    email: user.email,
                    phone: phone,
                    nombre: nombre,
                    grado: grado,
                    total: totalPrice,
                    totalPagado: 0,
                    escuela: escuela,
                    metodoDePago: "ACH",
                    banco: "Global Bank",
                    estadoDePago: "Pendiente",
                    fecha: formattedDate,
                    id: docId,
                    data: allItems
            }).then((r) => {
                history.push("/Inicio");
            })
    })

//I was thinking here add a query or something (for each one)  but didn't
//work it brings data1.id as undentified
const librosRefNuevos = db.collection('libros');
const queryRefNuevos = librosRefNuevos.where('id', 'array-contains', data1.id);

但是,如果我执行 data1[0].id 它确实会带回数组的第一个 id,所以可能是一个 for each 但我知道如何为每个与 where 做一个...也许我让自己复杂化了,这就是为什么我我来了哈哈

我希望这更具描述性,如果需要其他内容,请告诉我

这就是它在 Firebase 中的样子

已修复

 const ref1 = db.collection('libros');
    const increment = firebase.firestore.FieldValue.increment(1);
    for (let i = 0; i < data1.length; i++){

    ref1.doc(data1[i].id).update({
      ordenado: increment
    })
  }

  const ref2 = db.collection('libros_Opcionales');
    for (let i = 0; i < data2.length; i++){

    ref2.doc(data2[i].id).update({
      ordenado: increment
    })
  }

  const ref3 = db.collection('productos_AIB');
    for (let i = 0; i < data3.length; i++){

    ref3.doc(data3[i].id).update({
      ordenado: increment
    })
  }

【问题讨论】:

  • 我强烈建议从Book[][] 切换到Record&lt;string, Book[]&gt;,其中字符串是集合路径或只是名称。例如listaLibros = { "collectionA": booksInA, "collectionB": booksInB, "collectionC": booksInC }。然后,如果一个特定的集合是空的,你可以简单地省略它。
  • 我认为那段代码被误解了 data[0,1,2 etc] 定义集合 0 是第一个,1 是第二个集合,2 是每个位的第三个和最后一个集合该集合中的所有书籍,这就是为什么在数组 print 中显示为 4,0,3
  • 虽然我理解你想要做什么,但我会让自己更清楚 - 如果你的代码可能被误解,那就是糟糕的代码。如果您需要添加一个新集合怎么办?如果集合的顺序没有意义怎么办?如果您需要在 A 和 B 之间添加一个集合怎么办?如果一个新人出现将您的数​​组解构为const [colA, colC] = data 并且显然错过了colB 那么现在所有数据都搞砸了怎么办?如果我只需要来自 C 的数据,我怎么知道 C 在索引 2 中?我怎么知道代码后面 100 行是哪个索引?
  • Welp 我说数据分为 3 个数组,每个数组代表我提到的一个集合。我划分的方式是 data[0] 作为第一个集合,data[1] 作为第二个集合,最后 data[2] 作为最后一个集合。
  • 另外,我不需要新的收藏,用户不能添加超过 3 个,因为从表格中获取数据,您可以从每个收藏中选择书籍,如果您可以上传图片需要它。

标签: arrays reactjs firebase google-cloud-firestore


【解决方案1】:

根据另一个答案,我设法做出了一个适合我的答案

const ref1 = db.collection('libros');
    const increment = firebase.firestore.FieldValue.increment(1);
    for (let i = 0; i < data1.length; i++){

    ref1.doc(data1[i].id).update({
      ordenado: increment
    })
  }

  const ref2 = db.collection('libros_Opcionales');
    for (let i = 0; i < data2.length; i++){

    ref2.doc(data2[i].id).update({
      ordenado: increment
    })
  }

  const ref3 = db.collection('productos_AIB');
    for (let i = 0; i < data3.length; i++){

    ref3.doc(data3[i].id).update({
      ordenado: increment
    })
  }

【讨论】:

    【解决方案2】:

    我会简单地遍历每个 data 数组,并在更新字段之前检查每个集合中是否存在相应的文档。

    const data = JSON.parse(window.localStorage.getItem("listaLibros"));
    
    for (int i = 0; i < 3; i++) {
        for (const item of data[i]) {
            // Check libros
            const libro = await db.doc(`libros/{item.id}`).get();
            if (libro.exists) {
                await db.doc(`libros/{item.id}`).update({
                    ordered: libro.get('ordered') + 1
                })
            }
            
            // Check libros_Opcionales
            const libroOpcional = await db.doc(`libros_Opcionales/{item.id}`).get();
            if (libroOpcional.exists) {
                await db.doc(`libros_Opcionales/{item.id}`).update({
                    ordered: libroOpcional.get('ordered') + 1
                })
            }
    
            // Check productos_AIB
            const producto = await db.doc(`productos_AIB/{item.id}`).get();
            if (producto.exists) {
                await db.doc(`productos_AIB/{item.id}`).update({
                    ordered: producto.get('ordered') + 1
                })
            }
        }
    }
    

    【讨论】:

    • 如果我错了,请纠正我,但不会 int 1=0; i
    • 在此之后,我想我
    • @ReactPotato 我的理解是data 由三个数组组成,每个数组的长度都不同。第二个循环遍历所有值,无论长度如何。 data 只有三个成员,不是吗?
    • 是的只有data1,data2和data3但是我不明白为什么你有for (int i = 0; i &lt; 3; i++)那不是只检查数据3次吗?另外我相信你必须分开 for 循环,因为它们有不同的长度。我将根据我从您的代码中看到的内容(正在工作)更新我刚刚所做的事情,但 +1 似乎被覆盖而不是 ++1
    • 另外 libro.get('ordered') 不起作用它只是告诉我没有定义所以我决定检查值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2020-01-12
    • 2021-05-22
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多