Я пытаюсь разработать приложение-игру для викторины, используя Firestore.Я хотел бы предоставить систему рейтинга для пользователей.Чтобы добиться этого, я запрашиваю пользовательские документы по категориям и создаю новый документ списка лидеров.Я проверил его с Java, и он отлично работает (см. Код ниже).Но сейчас я хотел бы создать для этого облачную функцию Firebase.Было бы здорово, если бы я мог запланировать запуск функции два раза в день (для ограничения операций чтения и записи) или путем запуска ее с помощью URL-вызова.Похоже, firebase поддерживает обе возможности.К сожалению, я не обладаю знаниями ни в JavaScript, ни в машинописи.Поэтому я хотел бы спросить здесь, может ли кто-нибудь преобразовать приведенный ниже java-код в javascript-код для облачной функции firebase с возможностью планирования запуска функции в определенное время или путем ее запуска через URL-запрос?
final HashMap<String, Map<String, Long>> rankingsColl = new HashMap<>();
final Map<String, Long> cat1Map = new HashMap<>();
final Map<String, Long> cat2Map = new HashMap<>();
final FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference users = db.collection("usersColl");
users.whereGreaterThanOrEqualTo("stats.category1", 9)
.orderBy("stats.category1", Query.Direction.DESCENDING)
.limit(5).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
try {
String name = documentSnapshot.get("data.name").toString();
String code = documentSnapshot.get("data.code").toString();
long value = (long)documentSnapshot.get("stats.category1");
String fullName = name + " (" + code + ")";
cat1Map.put(fullName, (long)value);
} catch (Exception e) {
System.out.println("exception: " + e.getMessage());
}
}
rankingsColl.put("category1", cat1Map);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
});
users.whereGreaterThanOrEqualTo("stats.category2", 7)
.orderBy("stats.category2", Query.Direction.DESCENDING)
.limit(5).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
try {
String name = documentSnapshot.get("data.name").toString();
String code = documentSnapshot.get("data.code").toString();
long value = (long)documentSnapshot.get("stats.category2");
String fullName = name + " (" + code + ")";
cat2Map.put(fullName, (long)value);
} catch (Exception e) {
System.out.println("exception: " + e.getMessage());
}
}
rankingsColl.put("category2", cat2Map);
db.collection("Leaders").document("Leaderboard").set(rankingsColl).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
System.out.println("ranking works");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
System.out.println("error creating rankings");
System.out.println(e.getMessage());
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
});
Это то, чего я достиг до сих пор, читая документы по Firebase.Я думаю, что эти запросы должны работать.Но я понятия не имею, как получить нужные данные из каждого документа, добавить их на карту, создать новый документ на основе вновь созданной карты и поместить всю работу в функцию.
var users = db.collection('usersColl');
var query = users.where('stats.category1', '>', 9).orderBy('stats.category1', 'desc').limit(5).get()
.then(snapshot => {
if (snapshot.empty) {
console.log('No matching documents.');
return;
}
snapshot.forEach(doc => {
console.log(doc.id, '=>', doc.data());
// put desired fields of each document into a map1
});
})
.catch(err => {
console.log('Error getting documents', err);
});
var query2 = users.where('stats.category2', '>', 7).orderBy('stats.category1', 'desc').limit(5).get()
.then(snapshot => {
if (snapshot.empty) {
console.log('No matching documents.');
return;
}
snapshot.forEach(doc => {
console.log(doc.id, '=>', doc.data());
// put desired fields of each document into a map2
});
})
.catch(err => {
console.log('Error getting documents', err);
});
// create a new map<String, Map>, put map1 and map2 into this map and create a new document in firestore