如何在Golang MongoDB分组聚合中移除嵌套的password字段
解决方案
你可以通过以下3种常用方案实现嵌套password字段的移除,可根据你的实际场景选择:
方案1:修改$group阶段提前过滤(性能最优)
在$push构造data数组时,不要直接推入完整的$$ROOT文档,主动指定要保留的字段,从根源上避免password进入结果集,代码修改如下:
groupStage := bson.D{ {"$group", bson.D{ {"_id", bson.D{{"_id", "null"}}}, {"total", bson.D{{"$sum", 1}}}, // 替换原来的$push $$ROOT逻辑,手动指定保留字段 {"data", bson.D{{"$push", bson.D{ {"_id", "$$ROOT._id"}, {"email", "$$ROOT.email"}, {"is_verified", "$$ROOT.is_verified"}, {"username", "$$ROOT.username"}, }}}}, {"page", bson.D{{"$first", page}}}, {"per_page", bson.D{{"$first", perPage}}}, }}}
方案2:原逻辑新增嵌套字段排除(写法最简)
如果你的MongoDB版本≥4.2,直接在现有$project阶段新增一行排除data.password字段即可,MongoDB会自动移除data数组内所有元素的password字段:
projectStage := bson.D{ {"$project", bson.D{ {"_id", 0}, {"total", 1}, {"page", 1}, {"per_page", 1}, {"data", bson.D{{"$slice", []interface{}{"$data", startIndex, perPage}}}}, {"data.password", 0}, // 新增这一行即可 }}}
方案3:通过$map遍历处理(兼容性最好)
如果MongoDB版本较低不支持直接排除数组嵌套字段,可以新增一个$project阶段用$map遍历data数组逐个移除password:
// 新增的处理data字段的project阶段 removePwdStage := bson.D{ {"$project", bson.D{ {"total", 1}, {"page", 1}, {"per_page", 1}, {"data", bson.D{{"$map", bson.D{ {"input", "$data"}, {"as", "user"}, {"in", bson.D{ {"_id", "$$user._id"}, {"email", "$$user.email"}, {"is_verified", "$$user.is_verified"}, {"username", "$$user.username"}, }}, }}}}, }}, } // 聚合管道新增该阶段 result, err := userCollection.Aggregate(ctx, mongo.Pipeline{ matchStage, groupStage, projectStage, removePwdStage, }, )
内容的提问来源于stack exchange,提问作者silvia zulinka
相关产品推荐
相关产品推荐

