向Firestore的数组字段添加值

60
我正在尝试使用Firebase云函数将聊天室的ID添加到用户文档中的数组字段中。我似乎无法弄清如何写入数组字段类型。这是我的云函数:

我试图使用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( () => {

        });

  });

这是我的数据库的样子:

输入图片描述

非常感谢任何建议,我刚接触Firestore。


可能是追加到Firebase数组的重复问题。 - Todd Kerpelman
4个回答

134

根据文档,他们新增了一个操作来追加或删除数组中的元素。更多信息请查看此处:https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array

示例:

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')
});

小心处理 FieldValue 方法的细节。 - Juan Antonio
22
arrayUnion 只会在元素不存在时添加它。是否有一种方法可以添加重复的元素? - FirefoxMetzger
如何使用事务执行上述操作? - Slick Slime
需要在该路径上具有“更新”权限。 - Ricky Levi
@FirefoxMetzger 如果数组包含多个字段,该怎么办? - Rohit Kumar

11

Firestore目前不允许您更新数组的单个字段。但是,您可以通过以下方式替换整个数组的内容:

admin.firestore().doc(`users/${userA}/chats`).update('array', [...]);
请注意,这可能会覆盖另一个客户端的某些写入。您可以在执行更新之前使用事务锁定文档。
admin.firestore().runTransaction(transaction => {
  return transaction.get(docRef).then(snapshot => {
    const largerArray = snapshot.get('array');
    largerArray.push('newfield');
    transaction.update(docRef, 'array', largerArray);
  });
});

1
注意,"push"操作后,const largerArray将转换为与array.length相关的数字。正确的方法是创建数组的引用,然后进行推送(push),然后使用该引用更新事务: const largerArray = snapshot.get('array');largerArray.push('newField')。 - Brian Sternari
9
这个答案已经不正确了。这个功能确实存在。Firebase文档的链接:https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array - Crashalot

9

现在是2023年,经过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")
      });

0
使用Firebase 9.x版本:
import { getFirestore, FieldValue } from 'firebase-admin/firestore';
import { initializeApp } from 'firebase-admin/app';
import admin from "firebase-admin";

const firebaseAdminApp = initializeApp ({
   credential: admin.credential.cert(serviceAccountCreds) 
});

const db = getFirestore(firebaseAdminApp);

let collectionName = 'cities';
let docID = 'DC'

let docRef = await db.collection(collectionName).doc(docID);
await docRef.update({regions: FieldValue.arrayUnion('Northern Virginia')});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接