2015-08-22 62 views
9
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 
    } 
) 

//試10000次插入如何在mgo中取消引用dbref?

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"}) 

//第一種方式這麼髒-_-!

// MySQL的:左加入用戶在user.id = post.uid,如何在氧化鎂做

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 
     } 
    } 
} 

輔助方式,ref屬性,但mgo.session?將嘗試findid

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

// 3TH方式,與馬pReduce ??

這是我的第一個golang + mongodb,那麼歸檔dbref或連接的最佳方式是什麼?

THX

+1

這個問題怎麼樣?我有同樣的問題 – alioygur

+0

我想你想在該嵌套循環m.User = u。 – ijt

回答

2

而不是使用DBRef的,你可以使用用於連接兩個或多個相關文件manual reference方法。例如你的結構可以只看如下:

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 
} 

然後可以使用$lookup aggregation stage進行左外連接。例如,爲了找出基於用戶的所有帖子:

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" 
    } 
    ] 
} 

替代存儲用戶和崗位在不同的藏品,也可以嵌入/子文件。又見Data Modelling

+0

注意'$ lookup'是Mongo版本3.2+ – johntellsall