#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'});
}