如何在firebase nodejs中根据特定的标准计算文档



我想用javascript中的firebase nodejs实现一个云函数,以计算其中一个属性具有特定值的文档数量。我正在寻找这样的东西:

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

其中"propToCheck"是用户属性,是我从应用程序中给出的参数的数据。

您所拥有的代码接近于可以工作的代码。这将满足您的要求:

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中计数的更多信息,请参阅这些关于分布式计数器的文档。

相关内容

  • 没有找到相关文章

最新更新