Firebase 云函数 firestore 数组 union

aja*_*xon 8 node.js firebase google-cloud-functions firebase-admin google-cloud-firestore

我无法让数组并集或增量在 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"
      }
    })
  }
Run Code Online (Sandbox Code Playgroud)

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

Ren*_*nec 3

根据您的评论,下面是我尝试过的 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>
Run Code Online (Sandbox Code Playgroud)