Javascript Firestore查询时间戳和geohash在一个查询中

Javascript Firestore查询时间戳和geohash在一个查询中,javascript,firebase,google-cloud-firestore,geohashing,Javascript,Firebase,Google Cloud Firestore,Geohashing,我试图使用时间戳和geohash查询我的Firestore数据库,但结果总是以空数组的形式返回。如果我只使用geohash或者只使用时间戳,那么我得到了结果,但是当我将它们一起使用时没有结果。运行此查询时,控制台中也没有任何错误。我不太清楚为什么这个查询不起作用,如果有任何帮助,我们将不胜感激。同样值得注意的是,我正在使用Firebase文档中建议的方法来处理geohash查询。以下是查询的代码: const bounds = geofire.geohashQueryBounds(center,

我试图使用时间戳和geohash查询我的Firestore数据库,但结果总是以空数组的形式返回。如果我只使用geohash或者只使用时间戳,那么我得到了结果,但是当我将它们一起使用时没有结果。运行此查询时,控制台中也没有任何错误。我不太清楚为什么这个查询不起作用,如果有任何帮助,我们将不胜感激。同样值得注意的是,我正在使用Firebase文档中建议的方法来处理geohash查询。以下是查询的代码:

const bounds = geofire.geohashQueryBounds(center, radiusInM);
const promises = [];
for (const b of bounds) {
    const query = firebase
        .firestore()
        .collection('scheduledWorkouts')
        .where('date', '>=', start) // start is a Firebase timestamp variable
        .where('date', '<=', end) // end is a Firebase timestamp variable
        .orderBy('date')
        .orderBy('geohash')
        .startAt(b[0])
        .endAt(b[1]);
    promises.push(query.get());
}

Promise.all(promises)
    .then((snapshots) => {
        const matchingDocs = [];

        for (const snap of snapshots) {
            for (const doc of snap.docs) {
                const lat = doc.get('location.lat');
                const lng = doc.get('location.lng');

                // filtering out false positives
                const distanceInKm = geofire.distanceBetween(
                    [lat, lng],
                    center
                );
                const distanceInM = distanceInKm * 1000;
                if (distanceInM <= radiusInM) {
                    matchingDocs.push(doc.data());
                }
            }
        }

        return matchingDocs;
    })
    .then((matchingDocs) => {
        console.log(matchingDocs);
    })
    .catch((error) => {
        console.log(error);
    });
const bounds=geofire.geohashQueryBounds(中心,半径nm);
常量承诺=[];
for(边界常数b){
const query=firebase
.firestore()
.collection('scheduledworkout')
.where('date','>=',start)//start是一个Firebase时间戳变量

.where('date',”Firestore对查询有此限制:

在复合查询中,范围(=)和不等于(!=,不在)比较必须全部筛选在同一字段上

虽然没有明确提到,
start*
end*
过滤器也属于此限制

通过使用geohash,您已经通过将纬度和经度组合在一个可以排序和过滤的值中来克服此限制。但是,通过在
日期
添加范围过滤器,您再次达到了相同的限制


过滤纬度、经度和日期的唯一方法是:

  • 通过以允许的格式存储日期,对日期使用相等筛选器。例如,如果要允许对特定的一周进行筛选,可以将日期存储为
    2021-05-26
    格式,并在
    中对7个值执行
    查询
  • 找到一种方法,将时间戳与您自己的值类型中的纬度和经度相结合,类似于geohash对纬度和经度所做的操作。这意味着您必须能够有效地表达时间与距离的关系,因此通常仅在定义非常明确的域中可行

  • 嘿,erflynn21。你在这方面有什么进展吗?我试图帮助你回答下面的问题。你有机会检查一下吗,这有意义吗?我知道这可能不是你希望的答案,但我仍然希望知道限制和解决办法是有帮助的。如果我的答案有用,请单击“向上投票”按钮(▲) 如果它回答了您的问题,请单击复选标记(✓) 接受它。这样其他人就知道你已经得到了(足够)的帮助。也请为延迟道歉!是的,这完全奏效了!非常感谢你的建议,我现在拥有了所需的功能,只需从Firebase进行最少的读取!