Firestore WriteBatch.commit() で特定の FieldValue を含むデータと件数制限について


500レコード以下でも件数制限に引っかかる時がある。

Firebase Firestore のトランザクション書き込みには最大500レコードまでしか同時に書き込めません (執筆時時点。

500レコードをこえるデータを書き込もうとすると、

maximum 500 writes allowed per request

というエラーが返されます。

一方 500 レコード以下の書き込みでも、上記のエラーになることがあります。
serverTimestamparrayUnionincrement などのフィールド変換のデータを含むときです。

理由

ドキュメントに書いてある
https://firebase.google.com/docs/firestore/manage-data/transactions?hl=ja#batched-writes

つまり、serverTimestamparrayUnionincrement などのフィールド変換は 1件 として計上されるので、
たとえば、

{
 updatedAt:  admin.firestore.FieldValue.serverTimestamp()
 title: 'foor'
}

みたいなデータの書き込みは 2レコードの書き込みとして計上されてしまいます。
同様のデータを251件書き込もうとするとエラーになってしまうわけです。

まとめ

ドキュメントにもあるので、知らなかったお前が悪いというのはそのとおりなんですが、、、、
壮大にハマったので誰かのためになればいいなと思い書いときます。

https://github.com/firebase/firebase-admin-node/issues/456#issuecomment-464187898
にもあるとおり、中の人も 「ごめん、むりだ。その代わりドキュメントに書いとくYO」 といっているので、バグではなく仕様ですね。