web-dev-qa-db-ja.com

Firestore-追加される前にIDを取得することは可能ですか?

Realtime Databaseで次のように追加される前にPush IDを取得できたことを知っています。

 DatabaseReference databaseReference= FirebaseDatabase.getInstance().getReference();
        String challengeId=databaseReference.Push().getKey();

このIDを使用して追加できます。

Cloud Firestore?でも取得できますか

38
Tal Barda

これは documentation で説明されています。ドキュメントの追加セクションの最後の段落を参照してください。

DocumentReference ref = db.collection("my_collection").document();
String myId = ref.getId();
79
34m0
const db = firebase.firestore();
const ref = db.collection('your_collection_name').doc();
const id = ref.id;
19

projectsRefは、firestoreコレクションの参照です。

dataは、firestoreにアップロードするキー、値を持つオブジェクトです。

afsは、コンストラクターに挿入されたanglefirestoreモジュールです

これは次の方法で行うことができます(コードはAngularFire2 v5用です。これは、Firebase SDKの他のバージョン、たとえばweb、ノードなどに似ています)

const pushkey = this.afs.createId();
const project = {' pushKey': pushkey, ...data };
this.projectsRef.doc(pushkey).set(project);

これにより、pushKeyにidを持つprojectsRefという新しいドキュメントがCollectionに生成され、そのドキュメントにはdocumentのidと同じpushKeyプロパティが設定されます

Setは既存のデータも削除することを忘れないでください

実際、.add()と.doc()。set()は.add()と同じです。idは自動生成されます。doc()。set()を使用すると、カスタムIDを指定できます。

13
Jassi

IDKはこれで役に立ちますが、ドキュメントのIDをFirestoreデータベース(つまり、コンソールに既に入力されているデータ)から取得したかったのです。

そのIDにオンザフライでアクセスする簡単な方法が必要だったため、次のようにドキュメントオブジェクトに追加しました。

const querySnapshot = await db.collection("catalog").get();
      querySnapshot.forEach(category => {
        const categoryData = category.data();
        categoryData.id = category.id;

これで、他のプロパティと同じようにidにアクセスできます。

IDKそもそもid.data()の一部ではない理由!

4
CodeFinity

残念ながら、これは機能しません:

let db = Firestore.firestore()

let documentID = db.collection(“myCollection”).addDocument(data: ["field": 0]).documentID

db.collection(“myOtherCollection”).document(documentID).setData(["field": 0])

DocumentIDがドキュメントのIDの取得を完了する前に2番目のステートメントが実行されるため、機能しません。そのため、次のドキュメントを設定する前に、documentIDの読み込みが完了するのを待つ必要があります。

let db = Firestore.firestore()

var documentRef: DocumentReference?

documentRef = db.collection(“myCollection”).addDocument(data: ["field": 0]) { error in
    guard error == nil, let documentID = documentRef?.documentID else { return }

    db.collection(“myOtherCollection”).document(documentID).setData(["field": 0])
}

それは最もきれいではありませんが、あなたが求めていることをする唯一の方法です。このコードはSwift 5にあります。

2
Ken Mueller

これは私のために動作します。同じトランザクションでドキュメントを更新します。ドキュメントを作成し、すぐにドキュメントIDでドキュメントを更新します。

        let db = Firestore.firestore().collection(“cities”)

        var ref: DocumentReference? = nil
        ref = db.addDocument(data: [
            “Name” : “Los Angeles”,
            “State: : “CA”
        ]) { err in
            if let err = err {
                print("Error adding document: \(err)")
            } else {
                print("Document added with ID: \(ref!.documentID)")
                db.document(ref!.documentID).updateData([
                    “myDocumentId” : "\(ref!.documentID)"
                ]) { err in
                    if let err = err {
                        print("Error updating document: \(err)")
                    } else {
                        print("Document successfully updated")
                    }
                }
            }
        }

よりクリーンな方法を見つけられればいいのですが、それまではこれでうまくいきます。

0
Jose Carrillo

Dartでは次を使用できます。

`var itemRef = Firestore.instance.collection("user")
 var doc = itemRef.document().documentID;
 await itemRef.document(doc).setData(data).then((val){
   print("document Id ----------------------: $doc");
 });`
0
Naveen Yadav