我知道这个问题是重复的,但是我在为Firebase Firestore作为数据库的特定用途寻找最佳解决方案时遇到了问题。
这是问题所在:
我的Firestore数据库中有很多标记,我只想加载我附近的标记。
一种解决方案可以是加载所有标记,并在false
之外设置LatLngBounds
的可见性,但这不是事实。
为什么?
您将始终从数据库中请求所有标记,特别是如果您有大量标记并且只需要加载其中几个标记,这将非常无用。
我问这个问题是为了帮助用户解决这个问题。您可以在下面找到解决方案。
答案 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)
);
}
}
}
});
您的请求将仅在此框中加载标记。
为什么这很重要?
如果您的数据库中有5000个标记,并且每天有10.000个用户,那么每次用户打开地图时,他都会向数据库请求5000个文档。如果每天有10.000人打开地图,则有50.000.000个文档请求。 如果您有Blaze计划,则每天的费用为$ 29.10。
试想一下,如果您有100.000个用户...每天将有299.10美元。
使用我的解决方案,您只能在可以定义增加或减少框的特定区域加载文档。
希望我帮助了许多用户。如果有人有更好的解决方案,我已经准备好听。