从Firestore加载标记的最佳方法

时间:2019-05-02 20:08:06

标签: android google-cloud-firestore google-maps-markers

我知道这个问题是重复的,但是我在为Firebase Firestore作为数据库的特定用途寻找最佳解决方案时遇到了问题。

这是问题所在:

我的Firestore数据库中有很多标记,我只想加载我附近的标记。

一种解决方案可以是加载所有标记,并在false之外设置LatLngBounds的可见性,但这不是事实。

为什么?

您将始终从数据库中请求所有标记,特别是如果您有大量标记并且只需要加载其中几个标记,这将非常无用。

我问这个问题是为了帮助用户解决这个问题。您可以在下面找到解决方案。

1 个答案:

答案 0 :(得分:0)

这里是我使用的解决方案

我在Firestore数据库上做了一个query,并在我的位置周围创建了一个框。

FirebaseFirestore database = FirebaseFirestore.getInstance();

CollectionReference locals = database.collection("locals");
//I created a box with user LatLng. Every marker inside this box will be loaded
Query markers = locals.whereGreaterThanOrEqualTo("location", new GeoPoint(userLat - 0.5, userLng - 0.5))
.whereLessThanOrEqualTo("location", new GeoPoint(userLat + 0.5, userLng + 0.5));

    markers.get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (DocumentSnapshot document : task.getResult()){ 

                            String localName = (String) document.get("localName");
                            GeoPoint location = (GeoPoint) document.get("location");
                            LatLng localPosition = new LatLng(location.getLatitude(), location.getLongitude());
                            Marker marker = mMap.addMarker(new MarkerOptions()
                                    .position(localPosition)
                                    .title(localName)
                                    );
                        }
                    }
                }
            });

以下是示例: enter image description here

您的请求将仅在此框中加载标记。

为什么这很重要?

如果您的数据库中有5000个标记,并且每天有10.000个用户,那么每次用户打开地图时,他都会向数据库请求5000个文档。如果每天有10.000人打开地图,则有50.000.000个文档请求。 如果您有Blaze计划,则每天的费用为$ 29.10。

试想一下,如果您有100.000个用户...每天将有299.10美元。

使用我的解决方案,您只能在可以定义增加或减少框的特定区域加载文档。

希望我帮助了许多用户。如果有人有更好的解决方案,我已经准备好听。