Как реализовать нормальные отношения между доками в mgo golang??
В агрегациях монги, начиная с 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))
}
Посты можно привязать к ObjectId пользователя, а затем получать чем-то вроде:db.posts.find({_id: <тут_id_пользователя>})