2017-01-23 5 views
1

Я пытаюсь вставить некоторые данные в MongoDB с помощью mgo, но результат не то, что я хотел.Вставить данные в MongoDB с помощью mgo

Моя структура

type Slow struct { 
    Endpoint string 
    Time  string 
    } 

Моя вставка заявление

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

Как я пытаюсь напечатать это

var results []Slow 

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

Мой выход (выстраивали JSON)

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

То, что я хотел

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

Спасибо.

ответ

0

Во-первых, вам, похоже, нужны результаты отсортированы по Endpoint. Если вы не укажете порядок сортировки при запросе, у вас нет гарантии какого-либо конкретного заказа. Поэтому запросите их следующим образом:

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

Далее, то, что вы хотите, не является представлением результатов JSON. Чтобы получить формат, который вы хотите, используйте следующий цикл:

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

Выход есть, как вы ожидаете, что (попробуйте на Go Playground):

{ 
    "/api/endpoint1":"0.8s", 
    "/api/endpoint2":"0.7s" 
} 
+0

Спасибо за ответ icza, это решило проблему в совершенстве. – l4c

Смежные вопросы