Firestore - возможно ли получить идентификатор до его добавления?

Я знаю, что в Realtime Database в Realtime Database я мог получить push ID прежде чем он был добавлен следующим образом:

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

и тогда я мог бы добавить его, используя этот идентификатор.

Могу ли я получить его также в Cloud Firestore?

Ответ 2

const db = firebase.firestore();
const ref = db.collection('your_collection_name').doc();
const id = ref.id;

Ответ 3

projectsRef - сборник firestore ref.

data - это объект с ключом, значение, которое вы хотите загрузить в firestore.

afs - модуль углового фильтра, введенный в конструктор

Вы можете сделать это следующим образом (код для AngularFire2 v5, который похож на любую другую версию firebase SDK, например, web, node и т.д.)

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

Это создаст новый документ в коллекции под названием projectsRef с его идентификатором в pushKey, и этот документ будет иметь свойство pushKey так же, как id документа

Помните, что установка также удалит все существующие данные

Фактически .add() и .doc(). set() совпадают с .add(), идентификатор автоматически генерируется, с .doc(). set() вы можете предоставить пользовательский идентификатор.

Ответ 4

IDK, если это поможет, но я хотел получить идентификатор для документа из базы данных Firestore, то есть данных, которые уже были введены в консоль.

Я хотел простой способ получить доступ к этому идентификатору на лету, поэтому я просто добавил его к объекту документа следующим образом:

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

Теперь я могу получить доступ к этому id же, как и к любому другому свойству.

IDK, почему id - это не просто часть .data() !

Ответ 5

К сожалению, это не будет работать:

let db = Firestore.firestore()

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

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

Это не работает, потому что второй оператор выполняется до того, как documentID завершит получение идентификатора документа. Итак, вам нужно подождать, пока 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.

Ответ 6

Это работает для меня. Я обновляю документ, находясь в той же транзакции. Я создаю документ и немедленно обновляю документ идентификатором документа.

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

Было бы неплохо найти более чистый способ сделать это, но до тех пор это работает для меня.

Ответ 7

В дартс вы можете использовать:

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