nextel
@nextel
ненавижу javascript

Как реализовать нормальные отношения между доками в mgo golang??

Здравствуйте, решил попробовать монго, нашел на сайте ручки к нему для go - пакетMGO.
так вот, к простеньким примерам
стуктурки
type User struct{
Name string
Posts []Post
}
type Post struct{
Post string
}

в таком варианте у нас получается куча структур постов внутри структуры юзер, что не очень хорошо
Вариант два
type User struct{
Name string

}
type Post struct{
User User.id
Post string
}

в таком варианте получатется что то аля sql отношение, этот вариант конечно веселей, но как все это выгребать и отображать на страице?

я пока вижу только 1 вариант,

создаем структуру которая будет выглядеть обослютно так же как в первом варианте, а потом заполнять ее в два прохода 1 выгребли юзера засунули в струтуру, вышребли посты по юзерид засунули в массив posts этой же структуры ,
получается тоже как бы документ вдокументе но зато в базе нет дубликатов.
так же смотрел наmgo.pipe и на DBREFS но толи лыжи не едут толи яне могу понять ка кэто работет.. как мне лучше все это организовать?
  • Вопрос задан
  • 1104 просмотра
Решения вопроса 2
mirrr
@mirrr
Программист и просто хороший человек
В агрегациях монги, начиная с 3.2 есть аналог LEFT JOIN - $lookup. В mgo агрегации реализуются через Pipe. Маленький пример на коленке, в поле news при выборке попадают все новости автора:

package main

import (
	"encoding/json"
	"fmt"
	"gopkg.in/mgo.v2"
)

type (
	obj map[string]interface{}
	arr []interface{}
)

func main() {
	mongo, err := mgo.Dial("localhost")
	if err != nil {
		panic(err)
	}

	info := []obj{}

	if err := mongo.DB("myDB").C("authors").Pipe(arr{
		obj{"$match": obj{"banned": false}},
		obj{"$lookup": obj{"from": "news", "localField": "_id", "foreignField": "authorID", "as": "news"}},
	}).All(&info); err != nil {
		fmt.Println("Error:", err)
	}

	printJSON(info)
}

func printJSON(t interface{}) {
	j, _ := json.MarshalIndent(t, "", "\t")
	fmt.Println(string(j))
}
Ответ написан
Комментировать
@Maxim_Samburskiy
Посты можно привязать к ObjectId пользователя, а затем получать чем-то вроде:
db.posts.find({_id: <тут_id_пользователя>})
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы