2011-12-15 82 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)