Ist es möglich, die ID zu erhalten, bevor sie hinzugefügt wurde?

76

Ich weiß, dass Realtime Databaseich das bekommen konnte, push IDbevor es so hinzugefügt wurde:

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

und dann könnte ich es mit dieser ID hinzufügen.

Kann ich es auch in der bekommen Cloud Firestore?

Tal Barda
quelle

Antworten:

145

Dies wird in der Dokumentation behandelt . Siehe den letzten Absatz des Abschnitts zum Hinzufügen eines Dokuments.

DocumentReference ref = db.collection("my_collection").doc();
String myId = ref.id;
34m0
quelle
3
Ist es möglich, dass das Abrufen der generierten ID vor dem Hinzufügen andere Daten nach dem Hinzufügen überschreibt? (weil diese ID vor ... generiert wurde)
Tal Barda
11
Ich habe es mit AngularFire2 zum Laufen gebracht, indem ichthis.db.collection('collections').ref.doc().id
krv
2
Der obige Code funktioniert bei mir nicht. Ich erhalte die Fehlermeldung, dass getId () keine Funktion ist. Für Werke die Antwort von @krv
stackovermat
2
Ist in der Tat veraltet, müssen Sie den Code in Albertos Antwort verwenden
Kevinius
2
Ich habe diese Antwort mit aktualisiert, um die alten Apis zu ersetzen.
Hugo Gresse
45
const db = firebase.firestore();
const ref = db.collection('your_collection_name').doc();
const id = ref.id;
Alberto Di Gioacchino
quelle
14
Bitte erläutern Sie Ihre Antworten, geben Sie nicht einfach den Code aus
Sterling Archer
Ich benutze Vue-Fire und dieser hat für mich funktioniert. Vielen Dank.
Gene Parcellano
6
@SterlingArcher Was gibt es zu erklären? Ehrliche Frage.
Ruan
2
@Ruan Eine typische Überlegung, die mir vor langer Zeit gesagt wurde, war: "Wenn es keine Erklärung braucht, wäre es eine Frage gewesen." Auf dieser Grundlage nehmen wir an, dass seitdem eine Frage beantwortet wurde, eine Erklärung, warum normalerweise erforderlich ist, um zu lernen
Sterling Archer
21

Sie können dies auf folgende Weise tun (Code ist für AngularFire2 v5, das jeder anderen Version des Firebase-SDK ähnelt, z. B. Web, Knoten usw.).

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

projectsRef ist die Referenz für die Firestore-Sammlung.

Daten sind ein Objekt mit Schlüssel, Wert, den Sie in den Firestore hochladen möchten.

afs ist ein Angularfirestore-Modul, das in den Konstruktor injiziert wird.

Dadurch wird in Collection ein neues Dokument mit dem Namen projectsRef generiert, dessen ID als pushKey angegeben wird. Dieses Dokument verfügt über die PushKey-Eigenschaft, die mit der ID des Dokuments identisch ist.

Denken Sie daran, set löscht auch alle vorhandenen Daten

Tatsächlich sind .add () und .doc (). Set () dieselben Operationen. Aber mit .add () wird die ID automatisch generiert und mit .doc (). Set () können Sie eine benutzerdefinierte ID angeben.

Jassi
quelle
4

IDK, wenn dies hilft, aber ich wollte die ID für das Dokument aus der Firestore-Datenbank abrufen, dh Daten, die bereits in die Konsole eingegeben wurden.

Ich wollte eine einfache Möglichkeit, im laufenden Betrieb auf diese ID zuzugreifen, und fügte sie einfach wie folgt zum Dokumentobjekt hinzu:

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

Jetzt kann ich darauf zugreifen, idgenau wie auf jede andere Immobilie.

IDK, warum das idnicht nur ein Teil von überhaupt ist .data()!

CodeFinity
quelle
Ich frage mich, ob es eine gute Praxis ist, dies zu tun. Es würde definitiv Sinn machen, außer die clientseitige Verwendung der Datenmodelle
wiwi
Es ist schon eine Weile her, seit ich mir das angeschaut habe, aber mir ist nichts 'Schlechtes' von diesem Ansatz bewusst.
CodeFinity
4

Die einfachste und aktualisierteste (2019) Methode, die die richtige Antwort auf die Hauptfrage ist:

"Ist es möglich, die ID zu erhalten, bevor sie hinzugefügt wurde?"

// Generate "locally" a new document in a collection
const document = yourFirestoreDb.collection('collectionName').doc();

// Get the new document Id
const documentUuid = document.id;

// Sets the new document (object that you want to insert) with its uuid as property
const response = await document.set({
      ...yourObjectToInsert,
      uuid: documentUuid
});
Frederiko Cesar
quelle
2

Dies wird leider nicht funktionieren:

let db = Firestore.firestore()

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

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

Es funktioniert nicht, da die zweite Anweisung ausgeführt wird, bevor die documentID die Dokument-ID abgerufen hat. Sie müssen also warten, bis die documentID vollständig geladen ist, bevor Sie das nächste Dokument festlegen:

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])
}

Es ist nicht die schönste, aber es ist die einzige Möglichkeit, das zu tun, was Sie verlangen. Dieser Code ist in Swift 5.

Ken Mueller
quelle
1

In Dart können Sie verwenden:

`var itemRef = Firestore.instance.collection("user")
 var doc = itemRef.document().documentID; // this is the id
 await itemRef.document(doc).setData(data).then((val){
   print("document Id ----------------------: $doc");
 });`
Naveen Yadav
quelle
1

Für die Laufzeit von node.js.

const documentRef = admin.firestore()
  .collection("pets")
  .doc()

await admin.firestore()
  .collection("pets")
  .doc(documentRef.id)
  .set({ id: documentRef.id })

Dadurch wird ein neues Dokument mit einer zufälligen ID erstellt und der Dokumentinhalt auf festgelegt

{ id: new_document_id }

Hoffe das erklärt gut, wie das funktioniert

Tomrozb
quelle
0

Das funktioniert bei mir. Ich aktualisiere das Dokument während derselben Transaktion. Ich erstelle das Dokument und aktualisiere das Dokument sofort mit der Dokument-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")
                    }
                }
            }
        }

Es wäre schön, einen saubereren Weg zu finden, aber bis dahin funktioniert das für mich.

GIJoeCodes
quelle
0

Im Knoten

var id = db.collection("collection name").doc().id;
Schnee
quelle
0

So erhalten Sie eine ID nach dem Speichern in Python:

doc_ref = db.collection('promotions').add(data)
return doc_ref[1].id
LinuxFelipe-COL
quelle
0

Dokumente für generierte ID

Wir können in den Dokumenten für doc()Methode sehen. Sie generieren eine neue ID und erstellen einfach eine neue ID-Basis darauf. Stellen Sie dann neue Daten mit der set()Methode ein.

try 
{
    var generatedID = currentRef.doc();
    var map = {'id': generatedID.id, 'name': 'New Data'};
    currentRef.doc(generatedID.id).set(map);
}
catch(e) 
{
    print(e);
}
Zuhdan Ubay
quelle