mgo.v2 не разархивирует вложенную карту в struct и вместо этого устанавливает bson.M

#mongodb #go #mgo

#mongodb #Вперед #mgo

Вопрос:

В настоящее время я работаю в проекте Go и использую mongo с gopkg.in/mgo.v2 у меня возникают проблемы с извлечением значений из базы данных, у меня есть структура, подобная:

 type person struct {
    Name string
    Age  int
    MyMap map[string]interface{}
} 
  

Позже у меня есть функция, которую я вызываю для получения результатов (ее часть интерфейса):

 func(m SomeInterface) Get(filter bson.M, target interface{}){
     collection := m.Db.C("myCollection")
     err := profilesCollection.Find(filter).One(val)
     if err != nil {
        panic("error reading from mongo")
    }
}
  

и я вызываю эту функцию как:

 p := person{}
myinterface.Get(somefilter, amp;p)
  

После выполнения этого p.myMap имеет тип bson.M и не map[string]interface{} …почему? и как я мог бы получить вместо этого карту, а не bson.M? Спасибо

Комментарии:

1. 1) они одного типа; bson.M есть map[string]interface{} ; 2) вам следует отказаться от mgo.v2, поскольку он устарел и больше не поддерживается.

2. Драйвер использует bson.M для разархивирования, если вы передаете interface{} . Если вам нужно map[string]interface{} , вам придется преобразовать bson.M в map[string]interface{} путем рекурсивной обработки и копирования данных.

3. @Adrian да, я читал это, это очень большой проект, и я им не владею, поэтому его сложно перенести. Итак, должен ли я использовать что-то вроде json marshal / unmarshal, чтобы правильно назначить ее моей структуре?

4. @BurakSerdar нет, ты этого не делаешь. Типы равны, вы можете просто ввести convert m := map[string]interface{}(myBsonM) .

5. Это просто: play.golang.org/p/bCqhJAIQ_4_S