2017-01-23 5 views
1

Ich versuche, einige Daten in MongoDB mit Mgo einfügen, aber das Ergebnis ist nicht das, was ich wollte.Einfügen von Daten in MongoDB mit Mgo

Mein struct

type Slow struct { 
    Endpoint string 
    Time  string 
    } 

Mein Insert-Anweisung

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

Wie ich versuche, es drucken

var results []Slow 

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

Mein Ausgang (gemarshallte JSON)

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

Was ich

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

Danke wollten.

Antwort

0

Zunächst scheinen die Ergebnisse nach Endpoint sortiert zu sein. Wenn Sie bei der Abfrage keine Sortierreihenfolge angeben, können Sie keine Garantie für eine bestimmte Bestellung übernehmen. So fragen Sie sie wie folgt:

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

Als nächstes, was Sie wollen, ist nicht die JSON-Darstellung der Ergebnisse. Um das Format, das Sie möchten, verwenden Sie die folgende Schleife:

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}")) 

Ausgabe ist, wie Sie erwarten, dass es (versuchen Sie es auf dem Go Playground):

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

Danke für die Antwort icza, löste dies das Problem perfekt. – l4c