从 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 美元。
使用我的解决方案,您只加载特定区域中的文档,您可以定义增加或减少框。
希望我帮助了很多用户。如果有人有更好的解决方案,我愿意倾听。
我知道这个问题是重复的,但我在寻找特定使用 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 美元。
使用我的解决方案,您只加载特定区域中的文档,您可以定义增加或减少框。
希望我帮助了很多用户。如果有人有更好的解决方案,我愿意倾听。