从 Firestore 加载标记的最佳方式

Best way to load markers from Firestore

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

问题是:

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

一种解决方案是加载所有标记并将可见性设置为 false(如果它们在 LatLngBounds 之外),但事实并非如此。

为什么?

你总是会从你的数据库中请求所有的标记,这是非常无用的,特别是如果你有大量的标记而你只需要加载其中的几个。

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

这是我使用的解决方案

我在我的 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)
                                    );
                        }
                    }
                }
            });

举个例子:

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

为什么这很重要?

如果您的数据库中有 5000 个标记并且每天有 10,000 个用户,则每次用户打开地图时,他都会向您的数据库请求 5000 个文档。如果每天有 10,000 人打开地图一次,将有 50,000,000 次文档请求。 如果您有 Blaze 计划,这将花费您每天 29.10 美元。

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

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

希望我帮助了很多用户。如果有人有更好的解决方案,我愿意倾听。