dongxizhe9755
2017-01-23 01:17
浏览 39

使用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"
    }
    
    打赏 评论

相关推荐 更多相似问题