使用 Go 获取集合中所有键的名称
Posted
技术标签:
【中文标题】使用 Go 获取集合中所有键的名称【英文标题】:Get names of all keys in the collection using Go 【发布时间】:2021-01-10 09:11:52 【问题描述】:我想获取 MongoDB 集合中所有键的名称。
例如,从这个:
"Id": ObjectId("5f5a010d431c4519dcda0e3d")
"title": "App"
"query": ""
"db": ""
"widgettype": ""
"tablename": "active_instance"
fields:Object
user:"name",
key:"passcode"
"status": "active"
"inlibrary": ""
"createdts": 1599733804
使用“gopkg.in/mgo.v2”和“gopkg.in/mgo.v2/bson”包。
err := mongodbSession.DB(dbName).C(collectionName).Find(bson.M).One(&result)
var keyset []string
for index, _ := range result
fmt.Printf("%+v\n", index)
keyset = append(keyset, index)
fmt.Println(keyset)
得到这样的输出
[_id title query db widgettype status fields inlibrary createdts ]
子密钥没有被匹配,即用户和密钥。
【问题讨论】:
【参考方案1】:嵌入文档将在您的result
中显示为另一个bson.M
值,因此您必须使用递归来遍历这些值。
您可以这样做:
func getKeys(m bson.M) (keys []string)
for k, v := range m
keys = append(keys, k)
if m2, ok := v.(bson.M); ok
keys = append(keys, getKeys(m2)...)
return
使用示例:
m := bson.M"Id": bson.ObjectId("5f5a010d431c4519dcda0e3d"),
"title": "App",
"query": "",
"db": "",
"widgettype": "",
"tablename": "active_instance",
"fields": bson.M
"user": "name",
"key": "passcode",
,
"status": "active",
"inlibrary": "",
"createdts": 1599733804,
keys := getKeys(m)
fmt.Println(keys)
哪个会输出(在Go Playground上试试):
[db widgettype createdts inlibrary _id title query tablename
fields user key status]
如果查看结果,user
和 key
已包含在内,但无法判断它们是文档的字段还是嵌入文档的字段。
您可以选择使用嵌入文档字段本身的字段名称作为嵌入文档字段的前缀,例如获取fields.user
和fields.key
。
你可以这样做:
func getKeys(m bson.M) (keys []string)
for k, v := range m
keys = append(keys, k)
if m2, ok := v.(bson.M); ok
for _, k2 := range getKeys(m2)
keys = append(keys, k+"."+k2)
return
哪个会输出(在Go Playground上试试):
[createdts title query db status inlibrary _id widgettype tablename
fields fields.user fields.key]
另请注意,上述解决方案不处理数组。如果你有数组,你也应该迭代它们,如果它们包含另一个数组或对象,你应该做同样的事情(递归地)。扩展它以处理数组也是一个练习。
【讨论】:
以上是关于使用 Go 获取集合中所有键的名称的主要内容,如果未能解决你的问题,请参考以下文章
如何从 MongoDB 集合中获取具有匹配键的最后 N 个元素
如何从 MongoDB 集合中获取具有匹配键的最后 N 个元素