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

// versuchen 10000 mal fügtWie kann ich dbref in mgo dereferenzieren?

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

// ersten Weg so schmutzig -_-!

// mysql: links Benutzer beitreten auf user.id = post.uid, wie in mgo zu tun

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

sekundär, mit ref Attribut, aber mgo.session? wird versuchen,

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

// 3. Art und Weise, mit ma findid preduce ??

es ist meine erste golang + mongodb, also was ist der beste Weg, dbref oder verbindet zu archivieren?

Thx

+1

Wie wäre es mit dieser Frage? Ich habe das gleiche Problem – alioygur

+0

Ich würde denken, dass Sie m.User = u in dieser verschachtelten Schleife wollen. – ijt

Antwort

2

Statt DBRef zu verwenden, können Sie manual reference Verfahren zum Verbinden von zwei oder mehr aufeinander bezogene Dokumente verwenden nur. Zum Beispiel können Sie Ihre Struktur aussehen wie unten:

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 
} 

Sie dann $lookup aggregation stage eine linke äußere Verknüpfung ausführen können. Zum Beispiel alle Beiträge auf Benutzer basiert, um herauszufinden:

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) 

Beispiel Ergebnis:

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

Alternative zu den Benutzern und Beiträge in getrennten Sammlungen speichern, könnten Sie auch einbetten/sub-Dokument. Siehe auch Data Modelling

+0

Hinweis '$ lookup' ist Mongo Version 3.2+ – johntellsall