Код, который у вас есть, близок к тому, что будет работать. Это будет делать то, что вы просите:
exports.countDocumentsWithSpecificProp= functions.https.onCall(async (data, context)=>{
const snap = await admin.firestore().collection('users').where("propToCheck", "==", data["propToCheck"]).get();
return {count: snap.docs.length};
});
Тем не менее, полных документов читает для каждого документа, соответствующего запросу, и вы будете платить соответственно. Это может быть неэффективно, и, если вы говорите о десятках тысяч и более документов, дорого и слишком медленно, чтобы быть разумным решением.
Как правило, с Firestore вам нужно динамически увеличивать счетчики как документы написаны. Например, вы можете сохранить счет в отдельной коллекции, увеличивая при создании документов. В упрощенном примере:
exports.countPropToCheck = functions.firestore.document('users/{userId}').onCreate(async (snap, context) => {
const valueToCount = snap.get('propToCheck');
await admin.firestore().collection('propToCheckCounts')
.doc(valueToCount).update({count: admin.firestore.FieldValue.increment(1)});
});
exports.countDocumentsWithSpecificProp = functions.https.onCall(async (data, context)=>{
const snap = await admin.firestore().collection('propToCheckCounts').doc(data["propToCheck"]).get();
return snap.data();
});
Предостережение заключается в том, что очевидно, что вы должны заранее знать, что вы собираетесь считать вещи на этом поле. Другое предостережение в том, что функции не гарантированно будут выполняться только один раз, поэтому, если вам нужен очень очень точный счет, вам необходимо периодически пересчитывать вручную.
См. эти документы на распределенных счетчиках. для получения дополнительной информации о подсчете в Firestore.