解析 query.whereNear 和 query.whereWithinKilometers 两个 return 空对象列表

Parse query.whereNear and query.whereWithinKilometers both return empty object list

首先,我在本地主机上使用 Parse Server,我的客户端是 Parse Android SDK。

我有一个 class "Place",其中包含名为 "location" 的 GeoPoint 字段。此 class 有 50 行,所有行都带有 "location",例如: -22.xxxxxx | -42.xxxxxx

当我尝试查询所有行时,没有 Geopoint 过滤器,我得到了所有 50。但是当我添加过滤器 query.whereWithinKilometersquery.whereNear 时,我得到一个空的 objects 变量

    ParseQuery<ParseObject> query = ParseQuery.getQuery("Place");
    Log.d("LOG 1", String.valueOf(gp.getLatitude()));
    Log.d("LOG 2", String.valueOf(gp.getLongitude()));
    query.whereWithinKilometers("location", gp, 150);
    query.findInBackground(new FindCallback<ParseObject>() {
        public void done(List<ParseObject> objects, ParseException e) {
            Log.d("LOG 3", objects.toString());
            if (e == null) {
                if (objects.size() > 0) {
                    for (int i = 0; i < objects.size(); i++) {
                        //do something here...
                    }                       
                }
            } else {
                Log.d("Query error", e.getMessage());
            }
        }
    });

日志 "LOG 1" 和 "LOG 2" 显示了我的正确坐标,因此 gp 地理点是正确的。

未显示 "LOG 3",因为 "objects.toString()" 抛出 NullPointerException。

结论:

完全相同的代码,没有 query.whereWithinKilometers 可以完美运行。而且de回调不到1秒。

使用query.whereWithinKilometers,回调需要5到10秒,然后returns空对象。我已经尝试了 15、150、1500、15000 公里,但没有任何回报。 class 中的所有地方都在我所在的城市,因此,10 公里就可以了。

我想不出还有什么要检查的。

我找到了解决办法。地理点查询需要 MongoDB 上的特定“2dsphere”索引才能工作。

解决方法是在MongoDB脚本shell上执行以下代码:

    db.Place.ensureIndex({ location: "2dsphere" });

其中 "Place" 是 class/collection,"location" 是地理点字段。