2010-05-25 126 views
3

在MySQL我使用JOIN和一個查詢是沒有問題的。那麼mongo呢?mongoDB多對多一個查詢?

想象類別和產品。

產品可能有更多類別。 類別可能有更多產品。 (多對多結構) 和管理員可以在管理中編輯類別(類別必須分開)

其可能在一個查詢中寫入具有類別名稱的產品?

我用這個結構

categories { 
    name:"categoryName", 
     product_id:["4b5783300334000000000aa9","5783300334000000000aa943","6c6793300334001000000006"] 
} 


products { 
    name:"productName", 
category_id:["4b5783300334000000000bb9","5783300334000000000bb943","6c6793300334001000000116"] 
} 

現在我可以簡單地讓所有的產品類別和產品在某些類別和單獨類別editation。但是如果我想用類別名稱編寫產品,我需要兩個查詢 - 一個用於獲取產品類別ID,另一個用於通過該ID從類別獲取類別名稱。

這是正確的方法嗎?或者這種結構不合適?我想只有一個查詢,但我不知道它是否可能。

回答

4

是的,MongoDB在這種特殊類型的操作中特別糟糕。但是,這也是一個範圍問題。如果您有3000萬個產品,並且您希望將300萬個產品加入到他們的類別中,您會發現它在許多數據庫中並不是很快(即使它只是一行代碼)。

MongoDB在這裏需要的是一些非規範化。

您的收藏可能會是這樣的:

categories { 
    _id:"mongoid", 
    name:"categoryName", 
    ... 
} 

products { 
    _id:"mongoid", 
    name:"productName", 
    categories:[ 
    {"4b5783300334000000000bb9":'categoryName'}, 
    {"5783300334000000000bb943":'CategoryName2'}, 
    {"6c6793300334001000000116":'categoryName3'} 
    ] 
} 

下面是它如何工作(粗略估計,沒有我的蒙戈實例方便):

抓鬥產品及其類別

db.products.find({"_id": {$in:[1,2,3]}, {name:1,categories:1})

獲取某產品分類的產品:

db.products.find({"categories.0": {$in:[x,y,z]}},{categories:1,name:1} }

是的,它不完全相同。當您更改類別的名稱時,您必須必須更新全部的產品記錄。我知道這看起來很奇怪,但這是非規範化的標準。

順便說一句,我假設你會有很多產品和少得多的類別。如果你在每個類別中說100個項目,這種方法可能是最好的。如果每個類別中有5個項目,那麼您可能需要在每個項目中存儲更多的類別信息。

1

是的,這是你擁有的唯一方法。沒有加入的可能性。

但是你可以在你的類別或產品文檔像增添了不少的信息:

categories { 
    name:"categoryName", 
     product_id:[ {"4b5783300334000000000aa9": 'productName'},{"5783300334000000000aa943":'productName2'},{"6c6793300334001000000006":'productName3'}] 
} 


products { 
    name:"productName", 
category_id:[{"4b5783300334000000000bb9":'categoryName'},{"5783300334000000000bb943":'CategoryName2',{"6c6793300334001000000116":'categoryName3'}] 
} 

但你需要做一些回調更新所有稿件時的變化。