登录
首页 >  Golang >  Go问答

在Go和MongoDB中,将“用户具有的角色”转换为“用户的角色”

来源:stackoverflow

时间:2024-03-09 13:42:25 118浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《在Go和MongoDB中,将“用户具有的角色”转换为“用户的角色”》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我正在使用 mongodb 驱动程序开发一个 go 应用程序。我有一组已分配角色的用户。为了方便起见,我将角色存储在 csv 字符串中。例如

bill.roles = "user,billing,admin"
bob.roles = "user"
sandy.roles = "user,billing"

我需要将它们转换为角色到用户的映射。例如

user = "bill,bob,sandy"
billing = "bill,sandy"
admin = "bill"

我目前正在通过循环遍历集合中的用户切片并构建一个 map[string][]string 来实现此目的,并将其连接回 csv 字符串

把 csv 与 slice 的讨论放在一边(我是开放的)...是否有更好的方法让 mongodb 在数据库中进行转换而不是所有这些循环?或者我已经走在正确的轨道上了。


正确答案


以下是存储用户角色和查询数据的一些详细信息 - 基于之前的评论等。考虑包含以下文档的集合 users - 用户及其角色存储在数组字段中: p>

{ name: "bob", roles: [ "admin", "user", "billing" ] }
{ name: "jane", roles: [ "user", "billing" ] }
{ name: "krish", roles: [ "admin", "user" ] }
{ name: "jill", roles: [ "user" ] }

查询数据如下(查询在 mongo shell 中运行):

db.users.find( { roles: "admin" } )    // find users with admin role
db.users.find( { roles: { $in: [ "admin", "billing" ] } } )    // users with admin or billing role
db.users.find( { roles: { $all: [ "user", "billing" ] } } )    // users with user and billing roles
db.users.find( { roles: "admin" }, { _id: 0, name: 1 } )       // users with admin role, project only the user name

这是一个聚合查询 - 按角色对用户进行分组。您还可以进一步按角色、计数等排序(此处未显示):

db.users.aggregate([
  { 
      $unwind: "$roles" 
  },
  { 
      $group: { 
          _id: { role: "$roles" }, 
          users: { $push: "$name" } 
      } 
  }
])

输出:

{ "_id" : { "role" : "billing" }, "users" : [ "bob", "jane" ] }
{ "_id" : { "role" : "admin" }, "users" : [ "bob", "krish" ] }
{ "_id" : { "role" : "user" }, "users" : [ "bob", "jane", "krish", "jill" ] }

参考Query an Array

好了,本文到此结束,带大家了解了《在Go和MongoDB中,将“用户具有的角色”转换为“用户的角色”》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>