2011-12-15 51 views
1

这是我的集合:(很多对多)MongoDB的许多一对多搜索

演员:

{ 
_id: 1, 
name: "Name 1" 
} 

电影:

{ 
    _id: 1, 
    name: "The Terminator", 
    production_year: 1984, 
    actors: [ 
      { 
       actors_id: 1, 
       role_id : 1 
      }, 
      { 
      actors_id: 2, 
      role_id : 1 
      } 
      ] 
} 

我不能让一个一些电影的演员名单

这是不是一个问题,当我有这个:

{ 
    _id: 1, 
    name: "The Terminator", 
    production_year: 1984, 
    actors: [1,2,3,4,5] (actors id's) 
} 

var a = db.movies.findOne(name:"The Terminator").actors 
db.actors.find({"_id":{$in:a}}) 

但是,我怎样才能让它在这个上面的结构:

如果我这样做var a = db.movies.findOne(name:"The Terminator").actors

它返回我:

[ 
{ 
    actors_id: 1, 
    role_id : 1 
}, 
{ 
    actors_id: 2, 
    role_id : 1 
} 
] 

如何获得仅此于阵列[1,2](actors_id)来获得的演员姓名(以$中)

谢谢, 卓然

回答

2

你没有。在MongoDB中,你总是查询文档,所以你必须确保你的模式是这样的,你可以通过查询特定的文档来获得你需要的所有信息。在MongoDB中没有类似功能的连接/查看。

非规范化通常是在这种情况下最合适的选择。您的模式看起来像是为传统的关系数据库设计的,您将不得不尝试放弃关系数据带来的一些模式设计原则。

对于您的示例,您可以添加演员姓名到嵌入数组,以便在查询影片后获得该信息。

最后,考虑一下你是否使用了正确的工具来完成你需要做的事情。人们经常认为MongoDB是一个完全错误的“快速MySQL”。文档数据库与RDBMS甚至是k/v商店非常不同。如果你有很多相关的数据使用RDBMS。

+0

我明白了,谢谢你的回答Remon。如果我在嵌入数组中放置名称而不是ID,这是否意味着如果我想更新演员名称,则必须通过每部电影并对其进行更改(而不是仅将其更改为单独的集合并通过ID引用它)? – zugrina

+1

是的,这正是它的意思。请注意,您可以在所有电影上轻松地进行一次原子写入更新,但它可能会成为执行时间方面的重量级操作。这就是为什么我说你必须考虑是否使用了正确的工具。在这种情况下,你必须要问的问题是“演员多久更换一次名字?”。答案可能很少,所以你应该每隔几天/周运行一次更新就可以了 –

0

变量a在db.movies.findOne(name:"The Terminator").actors是一个文件数组,所以你必须使它成为一个整数数组(ids)