1 回答

TA貢獻1846條經驗 獲得超7個贊
嵌入的文檔將bson.M在您的 中顯示為另一個值result,因此您必須使用遞歸來遍歷它們。
您可以這樣做:
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包含在內,但無法判斷它們是文檔的字段還是嵌入文檔的字段。
您可以選擇使用嵌入文檔字段本身的字段名稱作為嵌入文檔字段的前綴,例如 getfields.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]
另請注意,上述解決方案不處理數組。如果你有數組,你也應該迭代它們,如果它們包含另一個數組或對象,你應該做同樣的事情(遞歸地)。擴展它以處理數組也是一個練習。
- 1 回答
- 0 關注
- 176 瀏覽
添加回答
舉報