Golang嵌套MongoDB中的对象

时间:2015-01-31 10:39:47

标签: mongodb go

我目前正在开发一个允许用户对某些对象进行评级的小应用程序,我的数据库(MongoDB)结构看起来像这样

Movie {
    Id int
    Name string
}
Actor {
    Id int
    Name string
    Age int
}
Movie_Actors {
    Movie Movie
    Actor Actor
}
User {
    Id int
    Username string
    Password string
}
Rating {
    Id int
    User User
    Actor Actor
    Rating int
}

当我想要选择Actors中少于5 Movie

的所有Ratings时,我的问题就开始了
// db *mgo.Database
c := db.C('ratings')
err := c.Find(...)

1 个答案:

答案 0 :(得分:0)

对于这个问题,我会稍微对你的模式进行非规范化,以使MongoDB中的查询更自然。仅查看此查询所需的类型,您可以使用以下内容:

type Movie struct {
    Id     bson.ObjectId `_id,omitempty`
    Name   string
    Actors []bson.ObjectId
}

type Actor struct {
    Id     bson.ObjectId `_id,omitempty`
    Name     string
    Age      int
    Ratings []Rating
    NRatings int
}

这里电影直接嵌入了演员ID,而演员跟踪评级本身的单独字段中的评分数量。如果您只想运行此单一类型的查询,则可以通过将影片直接嵌入播放其中的演员来完全非规范化数据模型。这样可以进一步简化查询,但也会产生大量信息重复,并阻止您将电影作为单独的实体处理。

有关这些权衡的讨论,请参阅the documentation on schema design

在此设计中,您可以使用以下内容找到电影Fantastic Mr. Fox中少于5个等级的演员:

// Find the actors in the movie
var m Movie
db.C("movies").Find(bson.M{"name": "Fantastic Mr. Fox"}).One(&m)

// Filter the actors to find those with less than 5 ratings.
var results []Actor
db.C("actors").Find(bson.M{"_id": bson.M{"$in": m.Actors}, "nratings": bson.M{"$lt": 5}}).All(&results)
fmt.Println(results)