2016-01-06 68 views
0

我有一個使用mgo/mongodb的應用程序。我正在使用嵌入式文檔而不是關係文檔。如何在mgo Mongodb中選擇相同類型的所有嵌入式文檔?

所以我有...(一些代碼編輯簡潔)。

type User struct { 
    Id   bson.ObjectId `bson:"_id,omitempty" json:"id"` 
    Name  string  `form:"name" bson:"name" json:"name"` 
    Password string  `form:"password" bson:"password,omitempty" json:"password" binding:"required"` 
    Email  string  `form:"email" bson:"email,omitempty" json:"email" binding:"required"` 
    Artists  []Artist  `form:"artists" bson:"artists,omitempty" json:"artists" inline` 
    Releases []Release  `form:"releases" bson:"releases,omitempty" json:"releases" inline` 
    ContentFeed []Content  `form:"content_feed" bson:"content_feed,omitempty" json:"content_feed" inline` 
    Profile  Profile  `form:"profile" bson:"profile,omitempty" json:"profile" inline` 
    TopTracks []Track  `form:"top_tracks" bson:"top_tracks" json:"top_tracks" inline` 
} 

type Artist struct { 
    Id  bson.ObjectId `bson:"_id,omitempty" json:"id"` 
    Title string  `form:"title" bson:"title" json:"title"` 
    Genres string  `form:"genres" bson:"genres" json:"genres"` 
} 

func (repo *ArtistRepo) GetArtists() ([]Artist, error) { 
    results := &[]Artist{} 
    err := repo.collection.Find(???).All(results) 
    return results, err 
} 

我試圖讓所有的藝術家,從所有的用戶本質上。但是我無法確定我的查詢需要什麼?我簡單地談到了Map/Reduce,但它似乎並不適用於我想要做的事情。

回答

2

我想你假設mgo是「ORM」。但這只是一種在Mongo中存儲數據的簡單方法。有3種不同的方法可以解決您的問題:

  1. 將不同的類型放入不同的集合中。這樣,每個文檔都是相同的類型。 (集合就像關係數據庫中的「表」)。

  2. 標記每個事物的類型(即將對象類型存儲在一個字段中),然後您可以查詢它。

  3. 如果您感覺危險,您可以假設所有藝術家都有流派,並且所有用戶都有一個配置文件。然後使用$exists僅選擇該類型。

第一個選項是通常的做法。你應該有特定的理由來做#2或#3,因爲它們可能會變慢。

+0

感謝您的回覆! 因此,例如,將我們的用戶和藝術家分爲兩個單獨的集合?但是,如何將用戶藝術家鏈接到用戶? –

+0

您可以存儲一個Object ID數組,並且記住要查詢其他集合。 https://docs.mongodb.org/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/#data-modeling-publisher-and-books – BraveNewCurrency

+0

有沒有推薦的方法來做到這一點使用Go mgo圖書館?還是僅僅是手動創建新文檔,獲取ID,然後更新父文檔並將ID推入數組的情況? 感謝您的幫助! –

相關問題