【问题标题】:Firebase cloud function firestore array unionFirebase 云函数 firestore 数组 union
【发布时间】:2019-08-28 18:48:48
【问题描述】:

我无法让数组联合或增量在 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,即使它当前存在并且是数字类型。

【问题讨论】:

  • 你能分享你的文档数据模型吗?您的文档中有object 字段吗?另外,如果我没记错的话,arrayUnion 不适用于嵌套数组。
  • 是的,有一个对象字段,更新工作不如预期。它只会覆盖数组中的现有数据,而不是追加新数据。增量也不起作用,并且始终设置为 1。如果是嵌套数组问题,我应该在日志中看到类似的内容。未处理的拒绝 (FirebaseError):使用无效数据调用函数 FieldValue.arrayUnion()。不支持嵌套数组
  • 您可以在更新前后的文档问题中添加屏幕截图吗?
  • 仅供参考,我刚刚尝试使用网页中的 JavaScript SDK。 arrayUnion 似乎工作,但不是 object 地图中的增量。如果您在对象之外放置另一个 count 字段(例如 count1),则增量有效。
  • arrayUnion 是使用一个对象还是一个简单的字符串?你能发布你刚刚测试的代码吗?

标签: node.js firebase google-cloud-firestore google-cloud-functions firebase-admin


【解决方案1】:

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

尝试如下:

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

您将看到arrayUnionincrement 在与arrayUnion(字段array1)的字符串数组和increment(字段count1)的数字一起使用时都有效,但不适用于复合对象。

<!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>

【讨论】:

    【解决方案2】:

    您可以使用 id 作为键的对象列表,然后使用 id 引用进行更新: https://firebase.google.com/docs/firestore/manage-data/add-data#update_fields_in_nested_objects

    docRef.update({
      object: {
        count: admin.firestore.FieldValue.increment(1),
        `list.${user_id}`: {
          space_id: newData.date_id,
          user: {
            user_id,
            displayName: "john doe"
          }
        }
      }
    })
    

    【讨论】:

      猜你喜欢
      • 2020-10-25
      • 2019-02-26
      • 2021-02-13
      • 1970-01-01
      • 2017-08-14
      • 2019-09-02
      • 1970-01-01
      • 2019-01-18
      相关资源
      最近更新 更多