如何在mgo Mongodb中选择所有相同类型的嵌入式文档?

时间:2016-01-06 23:22:28

标签: mongodb go mgo

我有一个使用mgo / mongodb的go应用程序。我使用的是嵌入式文档而不是关系文档。

所以我有......(为简洁起见,编写了一些代码)。

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,但它似乎并不适用于我正在尝试做的事情。

1 个答案:

答案 0 :(得分:2)

我认为您假设n是“ORM”。但它只是一种在Mongo中存储数据的简单方法。有3种不同的方法可以解决您的问题:

  1. 将不同类型放入不同的集合中。这样,每个文档都是相同的类型。 (集合类似于关系数据库中的“表”)。

  2. 使用它的类型标记每个东西(即将对象类型存储在字段中),然后您可以查询它。

  3. 如果您感觉很危险,您可以假设所有艺术家都有流派,并且所有用户都有个人资料。然后使用mgo仅选择该类型。

  4. 第一种选择是通常的方法。你应该有特定的理由去做#2或#3,因为它们可能会变慢。