我目前正在开发一个允许用户对某些对象进行评级的小应用程序,我的数据库(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(...)
答案 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)