Включить идентификатор документа в качестве идентификатора поля в firestore

#firebase #react-native #google-cloud-firestore

#node.js #firebase #google-облако-firestore #google-cloud-функции

Вопрос:

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

Пример:

 documents:       data:

eBgdTRE123       id:'eBgdTRE123'
                 name:'Jhon Doe'
                 job:'Programmer'     
  

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

1: чтобы использовать облачную функцию и иметь onCreate слушателя, и каждый раз, когда появляется новый документ, возьмите документ и установите поле идентификатора и обновите его вот как я это делаю

 exports.addDocIdToField = 

functions.firestore.document('collectionname/{docID}').onCreate((snap,context) => {
    const id = context.params.docID;
    return admin.firestore().collection('collectionname')
        .doc(id).set({ id: snap.id }, { merge: true })
        .then(() => {
            return null;
        })
        .catch((error) => {
            return null;
        });
})
  

2: использовать метод, описанный выше, при создании документа. добавить новый документ как только этот документ будет добавлен, получите недавно добавленный документ и обновите его id

оба они работают, но мой вопрос в том, могу ли я полагаться на такого рода операции? я имею в виду, если id это каким-либо образом undefined может вызвать ошибку в приложении.

или есть другие способы добиться этого?

Ответ №1:

Смотрите Синтаксис JS SDK v9 внизу

Существует более простой способ добиться этого, используя следующий doc() метод (здесь с помощью JavaScript SDK v8)

 var newDocRef = db.collection('collectionname').doc();
newDocRef.set({
                 name:'Jhon Doe',
                 job:'Programmer',
                 id: newDocRef.id
          })
  

Как объяснено в документе:

( doc() метод) получает DocumentReference для документа в коллекции по указанному пути. Если путь не указан, для возвращаемого DocumentReference будет использоваться автоматически сгенерированный уникальный идентификатор.


Вы найдете аналогичные методы в других клиентских SDK, здесь для Android и здесь для iOS.


ОБНОВЛЕНИЕ ДЛЯ JS SDK ВЕРСИИ 9:

 import { collection, doc, setDoc } from "firebase/firestore"; 

const newDocRef = doc(collection(db, "collectionname"));
await setDoc(
       newDocRef, 
       {
         name:'Jhon Doe',
         job:'Programmer',
         id: newDocRef.id
       }
   )
  

Комментарии:

1. Итак, это создало бы документ и одновременно установило идентификатор, верно?

2. Первая строка генерирует a DocumentReference с автоматически сгенерированным уникальным идентификатором, а вторая строка просто устанавливает поля этого документа и использует автоматически сгенерированный уникальный идентификатор.

3. Таким образом, это гарантирует, что каждый документ будет сгенерирован с полем id … его идеальное спасибо

4. Версия Firestore v9??

Ответ №2:

предыдущий метод работает нормально, но только для пояснения

на что это похоже на самом деле

 const { doc, collection, getFirestore, setDoc, addDoc } = require('firebase/firestore');
let collectionId = "Cars";
let docId;
let firestore = getFirestore();



   async function addDocWithId() {
        let collectionRef = collection(firestore, collectionId)
    
        addDoc(collectionRef, {}).then(res => {
            docId = res.id
            let docRef = doc(firestore, collectionId   "/"   docId)
    
            setDoc(docRef, {
                id: docId,
                car: 'Benz'
            })
        })

    };
  

как это было разъяснено

 const { doc, collection, getFirestore, setDoc, addDoc } = require('firebase/firestore')
let collectionId = "Cars"

let firestore = getFirestore()
async function addDocWithId() {
    let collectionRef = collection(firestore, collectionId)
    let docRef = doc(collectionRef)

    setDoc(docRef, {
        id: docRef.id,
        car: "Volvo"
    })


}
  

Ответ №3:

Если в случае, если есть кто-то, кому не повезло с приведенными выше ответами,
попробуйте это -> docref.set({ ‘id’:docref.ref.id }).
У меня это сработало. Ниже приведен пример использования этого.

 create(tutorial: any): any {
    var docref = this.db.collection('invxxx').doc()
    docref.set({ 'id':docref.ref.id, anotherField: 'anotherValue'});
  }