web-dev-qa-db-ja.com

トランザクション内に新しいドキュメントを追加するfirebase firestore-transaction.addは関数ではありません

私は次のようなことが可能であると想定していました:

transaction.add(collectionRef,{
  uid: userId,
  name: name,
  fsTimestamp: firebase.firestore.Timestamp.now(),
});

しかし、明らかにそうではありません:

transaction.addは関数ではありません

上記のメッセージは、chromeコンソール内に表示されます。

トランザクションのsetメソッドを使用して、新しいドキュメントをトランザクションで追加できることがわかりました。参照: https://firebase.google.com/docs/firestore/manage-data/transactions

問題は、add(これはサポートされていません)の代わりにsetを使用する場合、ドキュメントのIDは私が手動で作成する必要があり、firestoreが勝つということです作成しないでください。参照: https://firebase.google.com/docs/firestore/manage-data/add-data

自動的にIDを生成するaddメソッドがないことの欠点はありますか?

たとえば、firestore自体によって生成されたIDが、パフォーマンスを含むさまざまな問題を考慮して何らかの形で最適化されている可能性はありますか?

Transaction.setの使用中に、反応ネイティブでドキュメントIDを作成するためにどのライブラリ/メソッドを使用しますか?

ありがとう

6
honor

さらに掘り下げた後、firestore自体のソースコードで、以下のID生成用のクラス/メソッドを見つけました。

export class AutoId {
  static newId(): string {
    // Alphanumeric characters
    const chars =
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    let autoId = '';
    for (let i = 0; i < 20; i++) {
      autoId += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    assert(autoId.length === 20, 'Invalid auto ID: ' + autoId);
    return autoId;
  }
}

参照してください: https://github.com/firebase/firebase-js-sdk/blob/73a586c92afe3f39a844b2be86086fddb6877bb7/packages/firestore/src/util/misc.ts#L36

メソッド(assertステートメントを除く)を抽出し、コードのメソッド内に配置しました。次に、トランザクションのsetメソッドを次のように使用しました。

generateFirestoreId(){
        const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        let autoId = '';
        for (let i = 0; i < 20; i++) {
            autoId += chars.charAt(Math.floor(Math.random() * chars.length));
        }
        //assert(autoId.length === 20, 'Invalid auto ID: ' + autoId);
        return autoId;
    }

その後、

newDocRef = db.collection("PARENTCOLL").doc(PARENTDOCID).collection('SUBCOLL').doc(this.generateFirestoreId());
                        transaction.set(newDocRef,{
                            uid: userId,
                            name: name,
                            fsTimestamp: firebase.firestore.Timestamp.now(),
                        });

私は、ID生成にFirestore自体と同じアルゴを使用しているので、気分が良くなりました。

これが誰かを助け/導くことを願っています。

乾杯。

1
SoftwareTheory