Как разымевать dbref в Мго? -- go поле с участием mgo пол Связанный проблема

How to dereference dbref in mgo?


10
vote

проблема

русский
 <код> null1  

// попробуйте 10000 раз вставок

 <код> null2  

// первым способом так грязно -_-!

// mysql: левый присоединяйтесь к пользователям на user.id = post.uid, как сделать в mgo?

 <код> null3  

Средний путь, с атрибутом REF, но MgO.Session постарается переживать

 <код> null4  

// 3-й путь, с MapReduce ??

Это мой первый Golang + MongoDB, так как, как лучший способ архивировать DBREF или присоединиться?

thx

Английский оригинал
var (     type User struct{         Id bson.ObjectId `bson:"_id"`         Name string     }  type Post struct{     Id bson.ObjectId `bson:"_id"`     Uid string     User User     ref mgo.DBRef     Title string     } ) 

//try 10000 times inserts

id := bson.NewObjectId() user := &User{ id, "test"} db.C("users").insert(user)  post := db.C("Post").insert(&Post{Uid: id.hex(), ref: mgo.DBRef{"ref":"users", "id": id}, Title:"test dbref"}) 

//first way so dirty -_-!

//mysql: left join users on user.id=post.uid, how to do in mgo ?

posts := new([]User) db.C("posts").Find(nil).All(posts)  ids := []bson.ObjectId for _, p := range posts{   ids = append(ids, p.Uid) }  users := make([]User, len(ids)) db.C("users").Find(bson.M{"_id": {"$in": ids}}).All(users)  //and then set the User attribute? for _,u := range users {    for _, m := range m{        if m.Uid == u.Id {           m.User = m        }    } } 

secondary way,with ref attribute, but mgo.session will try to findid

for _,m := range posts{    db.FindRef(m.ref).One(&m.User) } 

//3th way, with mapReduce ??

it's my first golang + mongodb, so what is the best way to archive dbref or joins?

Thx

</div
     
   
   

Список ответов

3
 
vote
<Р> Вместо того, чтобы использовать DBRef , вы можете просто использовать руководство ссылочный метод для соединения двух или более связанных с ними документов , Например ваша структура может просто выглядеть, как показано ниже:
 <код> type User struct{     Id bson.ObjectId `bson:"_id"`     Name string `json:"name"` }  type Post struct{     UserId bson.ObjectId `json:"userid"` // manual ref to User     Title string }   
<Р> Вы можете использовать $ поиск агрегация этап для выполнения левое внешнее соединение. Например, чтобы найти все сообщения на основе пользователей:
 <код> pipeline := []bson.M{          bson.M{"$lookup": bson.M{                             "from": "posts",                              "foreignField":"userid",                             "localField":"_id",                             "as":"posts",                             },               },         }  result := []bson.M{}     err := coll_users.Pipe(pipeline).All(&result)   
<Р> Пример результата:
 <код> {   "_id": ObjectId("590ab726f4bab950360c2dbe"),   "name": "test",   "posts": [     {       "_id": ObjectId("590ab72619663bad7743ff9e"),       "userid": ObjectId("590ab726f4bab950360c2dbe"),       "title": "test manual reference"     }   ] }   
<Р> Альтернатива хранения пользователей и сообщения в отдельных семействах, можно также вставлять / суб-документ. Смотрите также Моделирование данных
 

Instead of using DBRef, you can just use manual reference method for connecting two or more related documents. For example your struct can just look as below:

type User struct{     Id bson.ObjectId `bson:"_id"`     Name string `json:"name"` }  type Post struct{     UserId bson.ObjectId `json:"userid"` // manual ref to User     Title string } 

You can then use $lookup aggregation stage to perform a left outer join. For example, to find out all posts based on users:

pipeline := []bson.M{          bson.M{"$lookup": bson.M{                             "from": "posts",                              "foreignField":"userid",                             "localField":"_id",                             "as":"posts",                             },               },         }  result := []bson.M{}     err := coll_users.Pipe(pipeline).All(&result) 

Example result:

{   "_id": ObjectId("590ab726f4bab950360c2dbe"),   "name": "test",   "posts": [     {       "_id": ObjectId("590ab72619663bad7743ff9e"),       "userid": ObjectId("590ab726f4bab950360c2dbe"),       "title": "test manual reference"     }   ] } 

Alternative to storing users and posts in separate collections, you could also embed/sub-document. See also Data Modelling

</div
 
 
 
 

Связанный проблема

0  GoLang Post Возврат Джосон ответ  ( Golang post return json response ) 
Я пытаюсь сделать запрос на мой (Magento) Weberver с помощью Golang. Мне удалось сделать запрос на пост, но, однако, я не получаю тот же ответ, я получаю пр...

0  Golang-Migrate Неизвестный водитель PostgreSQL Использование команды Terminal  ( Golang migrate unknown driver postgresql using terminal command ) 
Когда я пытаюсь перенести мою базу, используя команду терминала (<код> migrate -path scripts -database "postgresql://postgres:postgres@localhost:5439/basename...

1  Загрузка проблем гиперсидостера с GO Get с использованием модулей  ( Hyperledger problem downloading with go get using modules ) 
Я использую модули Go внутри моего проекта, а при попытке запустить: <код> go get -u github.com/hyperledger/fabric/core/chaincode/shim Мне побуждается с ошиб...

18  Запутанный Toupper и Totitle  ( Confusing toupper and totitle ) 
Есть ли разница между toupber и Функция Totitle ? ...

2  Golang 1.8 скользкая папка поставщика игнорирует  ( Golang 1 8 glide vendor folder ignoring ) 
Я работаю в Go версии 1.8, Glide для зависимости пакета и мою структуру проекта является <код> /Users/myName/go bin/ pkg/ src/ main.go ...

-1  httputil.newsinglehoStreverseProxy callworks увеличивает использование памяти  ( Httputil newsinglehostreverseproxy call increases memory usage ) 
Я использую эти две строки кода, чтобы служить обратным прокси-сервером <код> reverseProxy:=httputil.NewSingleHostReverseProxy(url) reverseProxy.ServeHTTP(r...

2  Горм и ломтик элементов с вложенными структурами и отношениями  ( Gorm and slice of elements with nested structs and relations ) 
Я использую gorm с Драйвер MySQL . У меня есть следующие структуры ... <код> type City struct { ID uint Name string Slug string StateID...

0  Программа пользовательского пространства (RUNC) регулирует размер физического адреса пространства процесса Docker Consier?  ( Does user space programrunc regulate the size of physical address space of a d ) 
Ниже приведен шаблон облака, чтобы настроить контейнеры задач ECS на экземпляре AWS EC2 (Linux): <код> TodobackendTaskDefinition: Type: "AWS::ECS::Tas...

1  Конвертировать * _CTYPE_FLOAT в Float32 в GO  ( Convert ctype float into float32 in go ) 
Я новичок, чтобы пойти и испытывать трудности при преобразовании datatype * _CTYPE_FLOAT в [] float32. Есть ли что-то, что я скучаю? Я даже подумал о преобраз...

0  Самый дешевый способ классификации http post объекты  ( Cheapest way to classify http post objects ) 
Я могу использовать Scipy, чтобы классифицировать текст на моей машине, но мне нужно классифицировать строковые объекты из http Post Post at, или в ближайшее ...

65  Можете ли вы объявить несколько переменных одновременно в Go?  ( Can you declare multiple variables at once in go ) 
Можно ли объявить несколько переменных сразу с помощью Golang? Например, в Python вы можете ввести это: <код> SubjectCode0 и все значения будут 80. ...

0  Каково лучшее решение для связи между коллекцией сервиса GRPC, написанной в Go и JavaScript Clients? [закрыто]  ( What is the best solution for communication between a collection of grpc service ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос находится на основе мнения . В настоящее вре...

-3  Как пройти массив типа Mutiple в одном Func  ( How to pass mutiple type array in single func ) 
У меня есть несколько структуров <код> type Base struct { Id string Name string Code string } <код> type Country struct { Base ... }...

2  Обработка вложенных zip-файлов с архивом / zip  ( Handling nested zip files with archive zip ) 
Я изо всех сил пытаюсь обрабатывать вложенные Zip-файлы (где zip-файл содержит другой zip-файл). Я пытаюсь восстановить ZIP-файл и перечислите все файлы, кото...

-1  Martini Go Server со встроенным веб-гусеником Получите слишком много открытых файлов после нескольких часов  ( Martini go server with built in web crawler get too many open files after a few ) 
Я построил веб-сканет, который служит некоторой http Info на своих выводов. Гусеничный гусеник работает как текущая рутина, а Martini запускает веб-сервер. Че...

Связанный проблема

0  GoLang Post Возврат Джосон ответ 
0  Golang-Migrate Неизвестный водитель PostgreSQL Использование команды Terminal 
1  Загрузка проблем гиперсидостера с GO Get с использованием модулей 
18  Запутанный Toupper и Totitle 
2  Golang 1.8 скользкая папка поставщика игнорирует 
-1  httputil.newsinglehoStreverseProxy callworks увеличивает использование памяти 
2  Горм и ломтик элементов с вложенными структурами и отношениями 
0  Программа пользовательского пространства (RUNC) регулирует размер физического адреса пространства процесса Docker Consier? 
1  Конвертировать * _CTYPE_FLOAT в Float32 в GO 
0  Самый дешевый способ классификации http post объекты 
65  Можете ли вы объявить несколько переменных одновременно в Go? 
0  Каково лучшее решение для связи между коллекцией сервиса GRPC, написанной в Go и JavaScript Clients? [закрыто] 
-3  Как пройти массив типа Mutiple в одном Func 
2  Обработка вложенных zip-файлов с архивом / zip 
-1  Martini Go Server со встроенным веб-гусеником Получите слишком много открытых файлов после нескольких часов