Облачная функция Firebase объединение массивов Firestore - PullRequest
0 голосов
/ 07 апреля 2019

Я не могу заставить объединение или приращение массива работать должным образом в облачных функциях 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, даже если он в настоящее время существует и имеет числовой тип.

1 Ответ

0 голосов
/ 07 апреля 2019

После вашего комментария, здесь ниже HTML-код, который я пробовал. Обратите внимание, что это не код облачной функции (который использует Admin SDK), а некоторый код JavaScript, использующий JavaScript SDK. Но, скорее всего, Admin SDK работает аналогично.

Чтобы попробовать еговыполните следующие действия:

  1. Создайте коллекцию testSO в Firestore и документ с идентификатором doc1 и одним пустым полем.
  2. Сохраните эту HTML-страницу на своем компьютере и откройте еев браузере.
  3. Затем измените значения и перезагрузите страницу в браузере для эксперимента с поведением

Вы увидите, что и arrayUnion, и increment работают при использовании с массивом строкдля 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>
...