我使用Go和MongoDB構建了一個RESTful API,並且遇到了一些困難,將一個文檔的JSON嵌入另一個文檔中。這是我想要完成的一個玩具例子。我有以下模式:編組時使用嵌入的json替換ObjectId struct
type Post struct {
ID bson.ObjectId `json:"id,omitempty"`
Title string `json:"title,omitempty"`
Owner bson.ObjectId `json:"owner,omitempty"` // references a User
}
type User struct {
ID bson.ObjectId `json:"id,omitempty"`
Name string `json:"name,omitempty"`
}
當後創建JSON,我想先查找MongoDB中職的所有者和嵌入所產生的用戶中稱後的JSON(就地的原來ObjectId
),像這樣:
{
"id": "...",
"title": "My awesome post",
"owner": {
"id": "...",
"name": "Cody"
}
}
我不太清楚如何做到這一點,除了手動構建使用map[string]interface{}
的JSON,像這樣:
post := LookupPost(...)
user := LookupUser(post.Owner)
m := map[string]interface{}{
"id": post.ID,
"title": post.Title,
"owner": map[string]interface{}{
"id": user.ID,
"name": user.Name,
},
}
b, _ := json.Marshal(m)
顯然這
不能很好地縮放
不是很乾燥 - 理想情況下,我可以利用每個結構定義中的json
標記並自動插入字段。
我是否錯過了一些東西,或者是我想要做的不可能?或者我只是沒有正確接近MongoDB/JSON?爲了說明問題,我來自一個Node.js背景,這種功能很簡單。
編輯
澄清的事情,這裏的一些不正確的Go代碼,顯示我想要做
func getPostJSON() []byte {
p := LookupPost(...)
u := LookupUser(p.Owner, ...)
uj, _ := json.Marshal(u)
p.Owner = uj // can't do this in Go
pj, _ := json.Marshal(p)
return pj
}
_「顯然這不能很好地擴展」_你是否想要擺脫遞歸調用?或者您是否在尋找某種訪問底層數據庫的代理對象以根據需要檢索數據? –
@SylvainLeroux對不起,不明確!我的意思是說它在代碼的複雜性方面不能很好地擴展。我主要關心的是保持乾爽 - 對於我的項目結構(這需要很長的時間來描述),我爲什麼要避免手動拼接json,這會帶來一些影響。 – Cody
我把'bson:'_ id,omitempty'json:「id,omitempty」'放在字符串字段中,並且像魅力一樣工作。 – Mohsen