【发布时间】:2020-09-27 19:06:00
【问题描述】:
我正在构建一个包含许多过滤器的约会应用。这是查询:
findMatch(itinerary: IItinerary): void {
const findMatchQuery = this.matchSvc.getMyMatch()
.where('location', '==', itinerary.location)
.where('endDay', '>=', itinerary.startDay)
.where('gender', '==', itinerary.searchGender);
findMatchQuery.get()
.then(listSnapshot => {
this.matches = [];
listSnapshot.forEach(async snapshot => {
let age = moment().diff(snapshot.data().dateOfBirth, 'years');
if ((snapshot.data().startDay <= itinerary.endDay) && (!this.dontShowList.includes(snapshot.id))) {
if ((age <= itinerary.ageRange.upper) && (age >= itinerary.ageRange.lower) && (snapshot.id !== itinerary.id)) {
this.matches.push({
snapshot.data(),
photoUrl: await this.getUserPhoto(snapshot.data().userId)
});
}
}
});
});
}
我意识到我在这里做的不好,但我不知道另一种方法可以做到这一点,因为你不能使用多个不等式运算符。
我必须使用 ('endDay', '>=', itinerary.startDay),但我还需要按年龄过滤,因此我使用 if 语句来按年龄过滤:
让年龄 = moment().diff(snapshot.data().dateOfBirth, 'years');
if ((age = itinerary.ageRange.lower)
这是为了确保我只将处于所需年龄范围内的用户添加到列表中。我希望能够将我的查询限制为 1,并且当用户向左或向右滑动时,再次查询 firebase 以获取另一个用户。我无法限制,因为我在查询之外使用 if 语句来根据用户所需的搜索进一步过滤列表。
假设我有来自 firebase 的 5 个限制。但是,这 5 个用户中没有一个属于该年龄范围。从 firebase 的角度来看,我有 5 个用户……firebase 不知道这 5 个用户被 if 语句进一步过滤,并且用户列表为空。如果我能够使用 limit() 选项,我需要我的整个查询使所有过滤器生效,这样我就不必从 firebase 中提取每条记录。
除了年龄过滤器之外,我实际上是在过滤一个日期范围……但同样,我只能在查询中使用一个不等式运算符。所以我对以下内容也有一个 if 语句: if ((snapshot.data().startDay
所以我在这里做的是寻找一个日期范围。这就是我想做的:
.where('location', '==', itinerary.location)
.where('endDay', '>=', itinerary.startDay)
.where('gender', '==', itinerary.searchGender)
.where('startDay', '<=', itinerary.endDay)
.where('age', '>=', itinerary.minimumAge)
.where('age', '<=', itinerary.maximumAge);
显然我不能使用上面的查询,我正在使用 if 语句来进一步过滤,但我想鉴于这些 if 语句,我无法使用 limit() 函数,但我想我会先问案例。
谢谢
【问题讨论】:
标签: firebase google-cloud-firestore