如何利用Mongoose获取集合中各文档的字段填充完成率?
查询文档集合中每个文档的完成率方法
根据你的需求,这里提供两种可行的实现方式:
一、数据库端直接计算(以MongoDB为例)
如果你的文档存储在文档型数据库中,直接用聚合查询可以避免客户端遍历的开销,效率更高。假设已知每个文档的总字段数为固定值,示例聚合管道如下:
db.yourCollection.aggregate([ { $project: { // 逐个判断字段是否非空,累加已填充字段数 filledFields: { $sum: [ { $cond: [{ $ne: ["$field1", null] }, 1, 0] }, { $cond: [{ $ne: ["$field2", null] }, 1, 0] }, { $cond: [{ $ne: ["$field3", null] }, 1, 0] }, // 按需添加所有需要统计的字段 ] }, totalFields: 8 // 替换为实际总字段数 } }, { $project: { documentId: "$_id", filledCount: "$filledFields", completionRate: { $divide: ["$filledFields", "$totalFields"] } } } ])
这段代码会返回每个文档的ID、已填充字段数和完成率(小数形式),如果需要百分比可以乘以100后取整。
二、客户端遍历计算(以Python处理JSON文档为例)
如果需要自己编写函数遍历处理,比如本地JSON文档集合,可以用以下代码实现:
def calculate_completion_rates(documents): # 确定总字段数:若所有文档字段一致,取第一个文档的字段数量;否则收集所有唯一字段 if not documents: return [] # 方案1:假设所有文档字段一致 total_fields = len(documents[0].keys()) # 方案2:若字段不统一,收集所有唯一字段 # all_fields = set() # for doc in documents: # all_fields.update(doc.keys()) # total_fields = len(all_fields) results = [] for doc in documents: # 统计非空字段(可根据业务调整空值判断逻辑,比如排除空字符串、空数组) filled_count = sum(1 for val in doc.values() if val is not None and val != "") completion_rate = filled_count / total_fields if total_fields > 0 else 0.0 results.append({ "document_id": doc.get("_id"), "filled_count": filled_count, "completion_rate": round(completion_rate, 2) }) return results # 示例调用 # sample_docs = [{"_id": 1, "name": "Khaled", "age": 28, "city": ""}, {"_id": 2, "name": None, "age": 35, "city": "Cairo"}] # for result in calculate_completion_rates(sample_docs): # print(result)
注意事项
- 空值判断逻辑要贴合业务需求:比如空字符串、空数组、0这些值是否算"已填充",需要调整判断条件。
- 如果文档字段不统一,要明确完成率的计算基准是"当前文档的字段总数"还是"集合中所有可能的字段总数",再对应调整代码。
内容的提问来源于stack exchange,提问作者khaled mohamed ram
相关产品推荐
相关产品推荐

