2012-09-24 111 views
1

我是mongoDB的初學者。我有兩本藏書和作者。 [名字和作品]分別是共同的專欄。使用內部連接我不得不發出,在圖書和作者的一些列。像這樣的SQL查詢:在MongoDB中加入兩個集合

select book.name,book.editions,book.characters,author.name 
from dbo.book book 
inner join dbo.author author on book.name=author.works_written 

我需要做的MongoDB中此相同的查詢。圖/減少?

+0

我有這樣 – Rudra

+0

的可能的複製聯接腳本[?我如何執行SQL加入MongoDB中相當於(http://stackoverflow.com/questions/2350495/how-do-i-perform-the-sql-join-equivalent-in-mongodb) – sidgate

回答

2

MongoDB不支持JOIN操作。當你需要這個功能時,你必須通過查詢這兩個集合來自己實現它。

因此,使用嵌入代替鏈接通常是一個好方法。

Map/Reduce作業通常是一項非常昂貴的操作。它只能偶爾用於數據挖掘目的。

+0

我需要如何使用mapreduce函數來完成它。 – Rudra

1

mongodb不是關係數據庫 - 所以這裏不可能有任何連接。聯接難以擴展。

mongodb實現連接的常用方法是數據非規範化。在你的情況下,你可以將作者姓名歸爲book table。那麼你的查詢將不需要連接。這是架構例如:

book 
{ 
    _id, 
    name, 
    editions, 
    characters, 
    author_name 
} 

請您將需要在藏書每次更新author_name當你更新作者收集的頭腦。

另一個解決方案 - 每本書的作者姓名的額外請求,但它會工作得慢很多。

+0

我需要如何使用mapreduce函數 – Rudra

+0

@Rudra:你不能在兩個集合上運行m/r。再一次 - mongodb不支持任何類型的連接,我在我的答案中列出了所有可能的解決方案。如果你需要加入 - 只需使用sql數據庫。在mongodb中,你可以玩和做任何你需要的只有一個集合。 –

2

我需要如何使用mapreduce函數來做到這一點。

db對象在MR中已被棄用了很長時間,因此無法一次在MR內同時獲取兩個表。

雖然有另一種解決方案:兩個MR。您在第一個集合上運行MR,首先輸出到需要的集合,然後使用第二個MR輸出到同一個集合,使用out選項(如reducemerge)將兩個集合「加入」到一起。

當然這很慢,所以更好的辦法是不要這樣做。至於:

select book.name,book.editions,book.characters,author.name 
from dbo.book book 
inner join dbo.author author on book.name=author.works_written 

此查詢可以是從藏書流光標,然後消瘦的DB非常快,在每次通過(這是確定要做到這一點MongoDB中)迭代抓住書的作者詳細信息。

您還可以從書籍中獲得一組作者id,然後一次查詢作者集合,並在客戶端對這兩個作出排序。

1

試試這個: -

db.book.aggregate([ 
    { 
     $lookup: 
     { 
      from: "author", 
      localField: "name", 
      foreignField: "works_written", 
      as: "nameWorkData" 
     } 
    } 
])