Firebase 云函数 firestore 数组联合

Firebase cloud function firestore array 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"
      }
    })
  }

函数运行时,它只是简单地覆盖list数组中已有的数据,即使当前存在并且是数字类型,计数也始终设置为1。

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

按如下方式尝试:

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

您会看到 arrayUnionincrement 在与 arrayUnion 的字符串数组(字段 array1)和 [=14 的数字一起使用时都有效=](字段 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>

您可以使用带有 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"
      }
    }
  }
})