#javascript #firebase #google-cloud-firestore
#javascript #firebase #google-облако-firestore
Вопрос:
Поэтому я просто хотел бы иметь автоматическое увеличение. В настоящее время все, что я создаю в своем приложении, этот документ в firebase автоматически получает большой случайный идентификатор. Я бы хотел, чтобы у каждого нового документа внутри коллекции было просто 1 id, например, я имею в виду, что первый документ внутри коллекции получает id = 1, второй документ автоматически получает id = 2 и так далее… вот мой код, например, для создания сообщения:
addPost = async ({ text, avatar, name }) => {
return new Promise((res, rej) => {
this.firestore
.collection("posts")
.add({
text,
//text2,
//id,
uid: this.uid,
timestamp: this.timestamp,
avatar,
name,
})
.then((ref) => {
ref.update({ id: ref.id });
res(ref);
})
.catch((error) => {
rej(error);
});
});
};
Комментарии:
1. То, что вы описываете, не так, как работает Firestore. Он не предоставляет дополнительных идентификаторов ни для документов, ни для полей. Такого рода вещи не масштабируются так, как того требует Firestore. Вы можете реализовать счетчик в отдельном документе самостоятельно, если вам не нужна масштабируемость Firestore по умолчанию.
Ответ №1:
Я могу хотя бы частично ответить на этот вопрос — монотонно изменяющийся идентификатор (т. Е. Увеличивающийся) в Firestore КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ. Случайное распределение этих «больших идентификаторов» является фундаментальной особенностью производительности firestore в масштабе. Если вам нужен какой-то порядок, используйте поле в документе, а не documentId .
Комментарии:
1. Хорошо, тогда я хочу использовать идентификатор поля. как увеличить это для каждого нового созданного документа?
2. Не хочу показаться злым, но StackOverflow — это не обучающий сайт; он предназначен для ответов на актуальные вопросы актуальных проблем. Прочитайте документацию, попробуйте что-нибудь; следите за ошибками и возвращайтесь с новым конкретным вопросом.
3. я нашел решение только в этот момент, я покажу, что u stackoverflow может помочь многим, просто посмотрите;)
Ответ №2:
КАК Я РЕШИЛ ЭТО: я СОЗДАЛ НОВУЮ КОЛЛЕКЦИЮ ПОД НАЗВАНИЕМ «id» и дал ей только одно поле, которое также называется «id» и имеет тип number. Я поставил значение 0. Секрет в том, чтобы получить это значение в состоянии и увеличивать его каждый раз, когда я создаю новую запись (иначе говоря, каждый раз, когда я хочу добавить свой идентификатор в какую-либо другую коллекцию). Затем для идентификатора, который я хочу увеличить в моей другой коллекции, я использую это состояние и ставлю 1. Сложно, но для всех, кому это нужно, вот код:
addPost = async ({ text, avatar, name }) => {
return new Promise((res, rej) => {
this.provjera();
this.firestore
.collection("posts")
.add({
text,
id: this.state.specialid 1,
uid: this.uid,
timestamp: this.timestamp,
avatar,
name,
})
.then((ref) => {
console.log(this.state.specialid);
this.setState({ specialid: this.state.specialid 1 });
this.firestore
.collection("id")
.doc("hl6ucFvzQ18lIFae9feo")
.update({ id: this.state.specialid });
//console.log(this.state.specialid);
res(ref);
})
.catch((error) => {
rej(error);
});
});
};
и вот метод проверки:
check = async () => {
const yolo = [];
const snapshot = await firebase
.firestore()
.collection("id")
.get()
.then((snapshot) => {
snapshot.docs.forEach((doc) => {
const { id } = doc.data();
yolo.push({ id: id });
this.setState({ specialid: yolo[0].id }); //this gets field value of id inside collection id which is 0.
});
});
};