Мне известно, что к этой теме задано множество вопросов, но другие вопросы, похоже, не отвечают на мой вопрос, специфичный для конкретного случая.
У меня следующая структура:
Каждый пользователь через FireAuth владеет культом.Этот Культ имеет множество дополнительных данных, например, какому Богу поклоняется его Культ, и текущему действию, которое хранится.Итак, мои коллекции Firestore выглядят примерно так:
• Пользователь
• Культ
• Боги
• Действия (Это действительно происходящие действия)
actionid
preActionid
attackerid (cultid инициатора)
defenderid (cultid инициатора)
done (логическое значение, которое проверяет, выполнено ли это действие)
...
• PreActions (Это действия, которые даны, и пользователь может выбрать один изэти)
Огромная проблема для меня состоит в том, чтобы связать все это вместе.Например, мне нужно иметь возможность проверить действие current , которое выполняет культ пользователя.Моя идея заключалась в том, чтобы проверить, не является ли действие культа actionid пустым, выполнить его и найти в текущих действиях конкретный actionid, извлечь его и отобразить.Как бы я пошел на такую цепь?
Мои настройки службы и firestore выглядят так, как описано в этом руководстве, поскольку я решил выбросить большую часть моего текущего кода и сделать его чистым: https://www.toptal.com/angular/state-management-in-angular-using-firebase Я полагаю, текст будет длиннымпредоставляя все дженерики и наследования, описанные там, поэтому я был бы рад, если бы вы могли кратко взглянуть на них.
Я также был бы рад любым советам с отображением моих данных в другой форме, потому что яиз-за моих привычек к SQL.
Спасибо за вашу помощь.
Я пытался отфильтровать через Frontend текущее действие, которое в итоге связалось с наблюдаемыми,Я попытался отфильтровать через backend предложения where для запросов, которые не увенчались успехом из-за отсутствия всех идентификаторов, доступных одновременно.
Редактировать: Поэтому я решил добавить код:
export abstract class FirestoreService<T> {
protected abstract basePath: string;
constructor(@Inject(AngularFirestore) protected firestore: AngularFirestore) {}
doc$(id: string): Observable<T> {
return this.firestore.doc<T>(`${this.basePath}/${id}`).valueChanges().pipe(
tap(r => {
if (!environment.production) {
console.groupCollapsed(`Firestore Streaming [${this.basePath}] [doc$] ${id}`);
console.log(r);
console.groupEnd();
}
})
);
}
collection$(queryFn?: QueryFn): Observable<T[]> {
return this.firestore.collection<T>(`${this.basePath}`, queryFn).valueChanges().pipe(
tap(r => {
if (!environment.production) {
console.groupCollapsed(`Firestore Streaming [${this.basePath}] [collection$]`);
console.table(r);
console.groupEnd();
}
}),
);
}
export abstract class StoreService<T> {
protected bs: BehaviorSubject<T>;
state$: Observable<T>;
state: T;
previous: T;
protected abstract store: string;
constructor(initialValue: Partial<T>) {
this.bs = new BehaviorSubject<T>(initialValue as T);
this.state$ = this.bs.asObservable();
this.state = initialValue as T;
this.state$.subscribe(s => {
this.state = s;
});
}
patch(newValue: Partial<T>, event: string = 'Not specified') {
this.previous = this.state;
const newState = Object.assign({}, this.state, newValue);
if (!environment.production) {
console.groupCollapsed(`[${this.store} store] [patch] [event: ${event}]`);
console.log('change', newValue);
console.log('prev', this.previous);
console.log('next', newState);
console.groupEnd();
}
this.bs.next(newState);
}
Редактировать: чтобы поставить вопрос в ином свете: если бы у вас была такая реляционная модель, как бы вы пошли на услуги итес и т. д.?
Редактировать: Итак, я прочитал немного о форк-соединениях и копировании данных внутри firestore, что, похоже, хорошо в базах данных NoSQL, но, к сожалению, ни один из них действительно не решил мою проблему.