firestore: arrayの中のmapの特定の要素を削除する

無効なFCMトークンを削除する処理を書こうとしたときに調べました。

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

import * as admin from 'firebase-admin';
// serviceAccountを取得
import { getInitializeAppOptions } from '../getInitializeAppOptions';

admin.initializeApp(getInitializeAppOptions());
const firestore = admin.firestore();
const docRef = firestore
  .collection('publics')
  .doc('map_delete_sample');
main();

async function setup() {
  await
    docRef.set({
      tokens: [
        { token: 'aaa', device: 'android' },
        { token: 'bbb', device: 'apns' }
      ]
    });
}

async function main() {
  await setup();
  await docRef
    .update({
      "tokens": admin.firestore.FieldValue.arrayRemove({ token: 'bbb', device: 'apns' })
    });
  console.log((await docRef.get()).data());
  // { tokens: [ { token: 'aaa', device: 'android' } ] }
}

// ほかのサンプルコードと変数名とか衝突しないようにする
export { }

オブジェクトそのもので比較することで削除対象を特定しているようです。