dongxizhe9755 2017-01-23 01:17
浏览 42
已采纳

使用mgo在MongoDB中插入数据

I'm trying to insert some data in MongoDB using mgo but the outcome is not what I wanted.

My struct

    type Slow struct {
    Endpoint string
    Time     string
    }

My insert statement

err := collection.Insert(&Slow{endpoint, e}) 
if err != nil {
    panic(err)
}

How I'm trying to print it

    var results []Slow

    err := collection.Find(nil).All(&results)
    if err != nil {
        panic(err)
    }   
    s, _ := json.MarshalIndent(results, "  ", "  ")
    w.Write(s)

My output (Marshaled JSON)

   [{
       "Endpoint": "/api/endpoint1",
       "Time": "0.8s"
    },
    {
       "Endpoint": "/api/endpoint2",
       "Time": "0.7s"
    }]

What I wanted

    {
      "/api/endpoint1":"0.8s",
      "/api/endpoint2":"0.7s"
    }
    //No brackets

Thank you.

  • 写回答

1条回答 默认 最新

  • douyong1974 2017-01-23 08:46
    关注

    First, you seem to want the results sorted by Endpoint. If you don't specify any sort order when querying, you can have no guarantee of any specific order. So query them like this:

    err := collection.Find(nil).Sort("endpoint").All(&results)
    

    Next, what you want is not the JSON representation of the results. To get the format you want, use the following loop:

    w.Write([]byte{'{'})
    for i, slow := range results {
        if i > 0 {
            w.Write([]byte{','})
        }
        w.Write([]byte(fmt.Sprintf("
    \t\"%s\":\"%v\"", slow.Endpoint, slow.Time)))
    }
    w.Write([]byte("
    }"))
    

    Output is as you expect it (try it on the Go Playground):

    {
        "/api/endpoint1":"0.8s",
        "/api/endpoint2":"0.7s"
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?