2015-08-22 13 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 
    } 
) 

// denemek 10000 kezmgo cinsinden dbref nasıl telafi edilir?

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

// ilk yolu çok kirli -_- ekler!

// MySQL:? Ref özniteliği ile, user.id = post.uid, MgO nasıl yapılacağına ilişkin kullanıcıları katılmak

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

ikincil yol bıraktı, ama mgo.session ma ile,

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

// 3th yolu findid çalışacağım pReduce ??

bu benim ilk golang + mongodb'im, bu yüzden dbref veya birleşimlerini arşivlemenin en iyi yolu nedir? Yerine DBRef kullanmanın

Thx

+1

'a bakın? Aynı sorunum var – alioygur

+0

Bu yuvalanmış döngü içinde m.User = u istediğinizi düşünürdüm. – ijt

cevap

2

, sadece iki veya daha fazla ilgili dokümanları bağlamak için manual reference yöntemi kullanabilirsiniz. Örneğin sizin yapı tıpkı aşağıda bakabilirsiniz:

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 
} 

Daha sonra sol dış birleşim gerçekleştirmek için $lookup aggregation stage kullanabilirsiniz. Örneğin, kullanıcılar temel tüm mesajları öğrenmek için:

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) 

Örnek sonucu: Ayrı koleksiyonlarında kullanıcıları ve mesajları saklamak için

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

Alternatif, ayrıca/alt belge yerleştirebilir. Ayrıca bu soru ile ilgili olarak Data Modelling

+0

Not '$ lookup', Mongo sürüm 3.2+ – johntellsall

İlgili konular