Задать вопрос

Как избежать копипаста при работе с mongodb?

Привет всем
Для того что бы работать с монгой написал быстренько код (ниже).
В монге предпологается хранить 100500 свойств для обьектов. Обьекты — квартиры, машины и так далее.

Меня интересует возможность уменьшить код. Ннапример при обьявлении типа я должен обьявить 100500 свойств:
type Car struct {
	Id          bson.ObjectId `bson:"_id"`
	Url         string        `bson:"url"`
	Description string        `bson:"descriprion"`
	Val        []CarProps    `bson:"CarProps"`

	Count int `bson:"count"`
}
type CarProps struct {
	CO2 string `bson:"CO2"`
        Fuel string `bson:"FUEL"`
}


PS:
Пример кода для работы с монгой.
func RunInsertQuery(document interface{}, mongoSession *mgo.Session, conn Conn) {
	sessionCopy := mongoSession.Copy()
	defer sessionCopy.Close()
	collection := sessionCopy.DB(conn.Database).C(conn.Collection)
	err := collection.Insert(document)
	if err != nil {
		log.Printf("RunQuery : ERROR : %s\n", err)
	}
}
func RunFindAllQuery(document interface{}, m bson.M, mongoSession *mgo.Session, conn Conn) (err error) {
	sessionCopy := mongoSession.Copy()
	defer sessionCopy.Close()
	collection := sessionCopy.DB(conn.Database).C(conn.Collection)

	err = collection.Find(m).All(document)
	fmt.Printf("%v\n", document)
	if err != nil {
		log.Printf("RunQuery : ERROR : %s\n", err)
	}
	return err
}
type Conn struct {
	Database   string
	Collection string
}

func main() {
conn := Conn{Database: Database, Collection: "test"}
	mongoDBDialInfo := &mgo.DialInfo{
		Addrs:    []string{MongoDBHosts},
		Timeout:  60 * time.Second,
		Database: conn.Database,
	}

	mongoSession, err := mgo.DialWithInfo(mongoDBDialInfo)
	if err != nil {
		log.Fatalf("CreateSession: %s\n", err)
		os.Exit(1)
	}

	defer mongoSession.Close()
        var carobj Car
	carobj.Id = bson.NewObjectId()
	carobj.Description = "sddsd"
	carobj.Tags = []CarProps{CarProps{CO2: "a"}}
	RunInsertQuery(carobj, mongoSession, conn)
        m := bson.M{"descriprion": "sddsd"}
        var carobjFindAll []Car
	_ = RunFindAllQuery(&carobjFindAll, m, mongoSession, conn)
	for cur := range carobjFindAll {
		fmt.Printf("\nrult: %s\n", carobjFindAll[cur].Id)
	}
}
  • Вопрос задан
  • 2397 просмотров
Подписаться 3 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 2
mututunus
@mututunus
Backend developer (Python, Golang)
Это расплата за статическую типизацию. Хотя, с другой стороны, это хорошо.
Ответ написан
@kolesnevg
Можно сделать финт ушами для этого - откажитесь от статической типизации, сделайте структуру объявления на подобии
type Item struct{
Fields map[string]string
}

и используйте для ключей и значений строки, при этом сохранение экземпляра объекта упростится
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы