У меня есть документ, который имеет следующую структуру
{ "_id" : "736722976", "value" : { "total_visit" : 4, "FIFA World Cup 2014" : 1, "Germany" : 1, "Algeria" : 1, "Thomas Muller" : 1, "Mesut Ozil" : 1, "Monsoon" : 1, "India Meteorological Department (IMD)" : 1, "Web Exclusive" : 2, "Specials" : 1, "Tapas Pal" : 1, "Twitter Trends" : 1, "Sunanda Pushkar" : 1, "Shashi Tharoor" : 1, "AIIMS" : 1, "special" : 1 } }
САМОЕ ВАЖНОЕ заключается в том, что структура поддокумента под ключом «значение» является переменной, поэтому я не могу создать для этого структуру. Я попытался последовать предложению здесь - Неструктурированные коллекции MongoDB с mgo
И я пришел с этим кодом ---
package main
import ("fmt"
"labix.org/v2/mgo" //importing mgo
"labix.org/v2/mgo/bson"
_ "reflect"
)
type AnalysisStruct struct{
Id string `bson:"_id,omitempty"`
Value bson.M `bson:",inline"`
}
func main() {
var m AnalysisStruct
//connecting to localhost mongodb
session, err := mgo.Dial("localhost")
if err != nil {
panic(err)
}
defer session.Close()
c := session.DB("my_analysis_db").C("analysis_mid_2")
iter := c.Find(nil).Iter()
for{
if iter.Next(&m){
fmt.Println(m.Value["value"]["total_visit"])
}else{
break
}
}
}
Когда я пытаюсь собрать это с помощью анализатора go build -v -o, он показывает мне эту ошибку ---
./analyzer.go:32: invalid operation: m.Value["value"]["total_visit"] (index of type interface {})
Я ужасно застрял с этим. Ничего не получается. Пожалуйста, может кто-нибудь помочь?
Спасибо
Я придумал этот код после некоторых исследований. Не самый оптимизированный точно. Но для моего случая работает. Принял помощь от http://blog.denevell.org/golang-interface-type-assertions-switch.html
https://groups.google.com/forum/#!topic/mgo-users/JYE-CP15az4
package main
import ("fmt"
"labix.org/v2/mgo" //importing mgo
"labix.org/v2/mgo/bson"
_ "reflect"
)
type AnalysisStruct struct{
Id string `bson:"_id,omitempty"`
Value bson.M `bson:",inline"`
}
func main() {
var m AnalysisStruct
//connecting to localhost mongodb
session, err := mgo.Dial("localhost")
if err != nil {
panic(err)
}
defer session.Close()
c := session.DB("consumergenepool_db").C("analysis_mid_2")
iter := c.Find(nil).Iter()
for{
if iter.Next(&m){
s := m.Value["value"].(bson.M)
data, _ := bson.Marshal(s)
var m bson.M
_ = bson.Unmarshal(data, &m)
fmt.Println(m)
for k, v := range m{
fmt.Print(k)
fmt.Print(" :: ")
fmt.Println(v)
}
}else{
break
}
}
}
Дайте мне знать ваши мысли по этому поводу.
Спасибо
interface{}
, поэтому вам нужно ввести утверждать это, чтобы использовать его. Вы пробовалиm.Value["value"].(map[string]interface{})["total_visit"]
? - person Ainar-G   schedule 08.07.2014