Как считать документы по заданным c критериям в базе данных nodejs? - PullRequest
0 голосов
/ 07 апреля 2020

Я хочу реализовать облачную функцию с помощью firebase nodejs в javascript, чтобы подсчитать количество документов, которые имеют значение c для одного из их свойств ie. Я ищу что-то вроде этого:

exports.countDocumentsWithSpecificProp= functions.https.onCall((data, context)=>{
    var num = admin.firestore().collection('users').where("propToCheck", "==", data["propToCheck"]).length;
    return num;
});

, где 'propToCheck' - это свойство пользователя ie и данные аргумента, который я даю из моего приложения.

1 Ответ

1 голос
/ 07 апреля 2020

Код, который у вас есть, близок к тому, что будет работать. Это будет делать то, что вы просите:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...