Firestore向数组字段添加值

Kra*_*itz 7 node.js firebase google-cloud-functions firebase-admin google-cloud-firestore

我试图使用Firebase云功能将聊天室的ID添加到数组字段中的用户文档.我似乎无法弄清楚写入数组字段类型的方法.这是我的云功能

  exports.updateMessages = functions.firestore.document('messages/{messageId}/conversation/{msgkey}').onCreate( (event) => {
    console.log('function started');
    const messagePayload = event.data.data();
    const userA = messagePayload.userA;
    const userB = messagePayload.userB;   

        return admin.firestore().doc(`users/${userA}/chats`).add({ event.params.messageId }).then( () => {

        });

  });
Run Code Online (Sandbox Code Playgroud)

这是我的数据库看起来的方式

在此输入图像描述

任何提示非常感谢,我是firestore的新手.

Sea*_*ici 17

从文档中,他们添加了一个新操作来追加或删除数组中的元素.在此处阅读更多内容:https://firebase.google.com/docs/firestore/manage-data/add-data

例:

var admin = require('firebase-admin');
// ...
var washingtonRef = db.collection('cities').doc('DC');

// Atomically add a new region to the "regions" array field.
var arrUnion = washingtonRef.update({
  regions: admin.firestore.FieldValue.arrayUnion('greater_virginia')
});
// Atomically remove a region from the "regions" array field.
var arrRm = washingtonRef.update({
  regions: admin.firestore.FieldValue.arrayRemove('east_coast')
});
Run Code Online (Sandbox Code Playgroud)

  • `arrayUnion` 只会添加不存在的元素。有没有办法添加项目而不考虑重复项? (10认同)

小智 10

这是 2021 年,经过 firebase firestore 的多次更新,在数组中添加数据而不删除其他数据的新方法是

      var washingtonRef = db.collection("cities").doc("DC");

      // Atomically add a new region to the "regions" array field.
       washingtonRef.update({
     regions: firebase.firestore.FieldValue.arrayUnion("greater_virginia")
     });

      // Atomically remove a region from the "regions" array field.
    washingtonRef.update({
        regions: firebase.firestore.FieldValue.arrayRemove("east_coast")
      });
Run Code Online (Sandbox Code Playgroud)


Seb*_*idt 5

Firestore当前不允许您更新数组的各个字段。但是,您可以这样替换数组的全部内容:

admin.firestore().doc(`users/${userA}/chats`).update('array', [...]);
Run Code Online (Sandbox Code Playgroud)

请注意,这可能会覆盖来自其他客户端的某些写入。在执行更新之前,可以使用事务锁定文档。

admin.firestore().runTransaction(transaction => {
  return transaction.get(docRef).then(snapshot => {
    const largerArray = snapshot.get('array');
    largerArray.push('newfield');
    transaction.update(docRef, 'array', largerArray);
  });
});
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不再正确。这个功能是存在的。Firebase 文档:https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array (5认同)