【发布时间】:2018-07-25 10:24:12
【问题描述】:
为了记录,我正在学习围棋。我正在尝试使用 mgo 包,我想插入一个新文档并将这个新创建的文档返回给用户(我正在尝试编写一个基本的 API)。我写了以下代码:
编辑:这是模型的结构:
type Book struct {
ISBN string `json:"isbn"`
Title string `json:"title"`
Authors []string `json:"authors"`
Price string `json:"price"`
}
session := s.Copy()
defer session.Close()
var book Book
decoder := json.NewDecoder(r.Body)
err := decoder.Decode(&book)
if err != nil {
ErrorWithJSON(w, "Incorrect body", http.StatusBadRequest)
return
}
c := session.DB("store").C("books")
info, err := c.Upsert(nil, book)
if err != nil {
ErrorWithJSON(w, "Database error", http.StatusInternalServerError)
log.Println("Failed insert book: ", err)
return
}
respBody, err := json.MarshalIndent(info, "", " ")
if err != nil {
log.Fatal(err)
}
ResponseWithJSON(w, respBody, http.StatusOK)
请注意 Book 是我之前创建的结构。上面的代码确实有效,但它返回的是 upsert 结果,如下所示:
{
"Updated": 1,
"Removed": 0,
"Matched": 1,
"UpsertedId": null
}
这不是最近创建的对象。如何让最近创建的对象作为响应返回(请注意,理想情况下,我希望确认文档已成功插入。我已经看到了其他问题,其中预先生成了 ID,但对于我所看到的它没有确认文档是创建的吗?)
【问题讨论】:
-
在插入对象后查询该对象。
-
但是查询的ID在哪里?
-
在您的对象中。这显然是根据您引用的输出对现有对象的更新,这意味着您已经有了 ID。
-
不,我正在尝试插入第一个。根据我目前找到的文档,
Insert也不提供 ID,因此建议使用 Upsert 方法 -
upsert 结果意味着您正在更新现有文档。