首页 > 解决方案 > Firebase 云函数 firestore 数组 union

问题描述

我无法让数组联合或增量在 firebase 云功能中正常工作。

return docRef.update({

  object: {
    count: admin.firestore.FieldValue.increment(1),
    list: admin.firestore.FieldValue.arrayUnion({
      space_id: newData.date_id,
      user: {
        displayName: "john doe"
      }
    })
  }

当函数运行时,它只是覆盖列表数组中的现有数据,并且计数始终设置为 1,即使它当前存在并且是数字类型。

标签: node.jsfirebasegoogle-cloud-firestoregoogle-cloud-functionsfirebase-admin

解决方案


在您发表评论之后,下面是我尝试过的 HTML 代码。请注意,它不是 Cloud Function 代码(使用 Admin SDK),而是一些使用 JavaScript SDK 的 JavaScript 代码。但很可能 Admin SDK 具有相同的行为。

要尝试它,请执行以下操作:

  1. testSO在 Firestore 中创建一个集合,并创建一个带有 IDdoc1和一个虚拟字段的文档。
  2. 将此 HTML 页面保存在您的计算机上并在浏览器中打开它。
  3. 然后更改值并在浏览器中重新加载页面以试验行为

当与 (field )的字符串数组和 (field ) 的数字一起使用时,您将看到两者都可以工作,但不能与复合arrayUnion对象一起使用。incrementarrayUnionarray1incrementcount1

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Title</title>

    <script src="https://www.gstatic.com/firebasejs/5.9.3/firebase-app.js"></script>
    <script src="https://www.gstatic.com/firebasejs/5.9.3/firebase-database.js"></script>
    <script src="https://www.gstatic.com/firebasejs/5.9.3/firebase-auth.js"></script>
    <script src="https://www.gstatic.com/firebasejs/5.9.3/firebase-functions.js"></script>
    <script src="https://www.gstatic.com/firebasejs/5.9.3/firebase-firestore.js"></script>
      </head>

  <body>
    <script>
      // Initialize Firebase
      var config = {
        apiKey: 'xxxxxxxxxxx',
        authDomain: 'xxxxxxxxxxx',
        databaseURL: 'xxxxxxxxxxx',
        projectId: 'xxxxxxxxxxx'
      };

      firebase.initializeApp(config);

      var db = firebase.firestore();

      db.doc('testSO/doc1').update({
        count1: firebase.firestore.FieldValue.increment(1),
        array1: firebase.firestore.FieldValue.arrayUnion('arrayItem'),
        object: {
          count: firebase.firestore.FieldValue.increment(1),
          list: firebase.firestore.FieldValue.arrayUnion({
            space_id: 'spaceNbr',
            user: {
              displayName: 'john doe'
            }
          })
        }
      });
    </script>
  </body>
</html>

推荐阅读