如何使用Firebase将新项目推送到数组中

时间:2019-08-08 11:04:15

标签: angular typescript firebase google-cloud-firestore

我正在尝试在Firebase的数组中推送新项目

我尝试过这样做,但是它只是替换了Firebase中数组的第一项

usersUid: [{ usersUid: player.userUid }]

提供者:

addPlayer(chatRoomUid: string, player: Player): Promise<any> {
    return this._getDoc(chatRoomUid).set({
      players: [
        {
          userUid: player.userUid,
          userName: player.userName,
          characterUid: player.characterUid,
          characterName: player.characterName
        }
      ],
      usersUid: [{ usersUid: player.userUid }]
    }, { merge: true });
  }

private _getDoc(chatRoomUid: string): AngularFirestoreDocument {
    return this.afs.doc(`chat_rooms/${chatRoomUid}`);
  }

型号:

usersUid: string[];

预期输出:

expected output

我得到了:

what i got

3 个答案:

答案 0 :(得分:1)

使用set时,将覆盖现有数据(在您的情况下为聊天室)。 如果要向userUid添加新ID,首先需要获取当前ID列表, 然后更改此行:

usersUid: [{ usersUid: player.userUid }]

收件人:

usersUid: listOfIds

list OfIds应该是一个数组,而不是对象。 (例如[1,2,3,4,5])

答案 1 :(得分:1)

找到了答案。

usersUid: firestore.FieldValue.arrayUnion(player.userUid)有效

请参阅:https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array

答案 2 :(得分:0)

在chat_rooms数组中使用.push而不是.set

https://github.com/angular/angularfire2/blob/master/docs/rtdb/lists.md#adding-new-items

const itemsRef = db.list('items');
itemsRef.push({ name: newName });