2015-01-09 119 views
0

我正在使用MongoDB,我想要獲取數據以顯示多次使用Type和Subtype的菜單,如果我訪問一個子類型,系統將顯示子類型的產品。MongoDB中的最佳解決方案體系結構

示例1對我來說比較好,因爲我只是每種類型都有一個集合,但如果我不訪問任何子類型,我也會加載所有產品。好吧,我知道,我可以使用投影,但有可能使用帶有查詢的投影嗎?我可以投影一個子類型的產品嗎?所以也許例子2在這種情況下是正確的方式,但我有兩個集合和更多的關係。

您認爲最好的解決方案是什麼?

實施例1

集合類型:

{ 
"_id" : ObjectId("53fae88aafb3dc3494e03225"), 
"name" : "TypeProduct", 
"subtypes" : [ 
{ 
    "name" : "Subtype1", 
    "products" : [ 
    { 
       "$ref" : "products", 
       "$id" : ObjectId("53fee4fcafb358a62d7684c3"), 
      "sku" : "0001", 
     "picture" : "http...jpg" 
      }, 
      { 
       "$ref" : "products", 
       "$id" : ObjectId("53fee656afb358a62d7684c4"), 
      "sku" : "0002", 
     "picture" : "http...jpg" 
      } 
    ] 
}, 
{ 
    "name" : "Subtype2", 
    "products" : [ 
    { 
       "$ref" : "products", 
       "$id" : ObjectId("53fee4fcafb358a62d7684c3"), 
      "sku" : "0001", 
     "picture" : "http...jpg" 
      }, 
      { 
       "$ref" : "products", 
       "$id" : ObjectId("53fee656afb358a62d7684c4"), 
      "sku" : "0003", 
     "picture" : "http...jpg" 
      } 
    ] 
} 
] 
} 

實施例2

集合類型

{ 
"_id" : ObjectId("53fae88aafb3dc3494e03225"), 
"name" : "TypeProduct", 
"subtypes" : [ 
{ 
     "$ref" : "subtypes", 
     "$id" : ObjectId("53fee4fcafb358a62d7684c3"), 
    "name" : "Subtype1" 
}, 
{ 
     "$ref" : "subtypes", 
     "$id" : ObjectId("53fee4fcafb358a62d7684c3"), 
    "name" : "Subtype2" 
} 
] 
} 

收集亞型

{ 
"_id" : ObjectId("53fee4fcafb358a62d7684c3"), 
"name" : "Subtype1", 
"products" : [ 
{ 
     "$ref" : "products", 
     "$id" : ObjectId("53fee4fcafb358a62d7684c3"), 
     "sku" : "0001", 
    "picture" : "http...jpg" 
    }, 
    { 
     "$ref" : "products", 
     "$id" : ObjectId("53fee656afb358a62d7684c4"), 
     "sku" : "0002", 
    "picture" : "http...jpg" 
    } 
] 
} 
+0

以'$'爲前綴的字段是不允許的,因爲它是MongoDB中用於其他目的的保留字符。 –

+0

是的,它是由Morphia生成的代碼,不是我的。 – user2443747

回答

0

MongoDB中的最佳解決方案是您顯示的第一個,因爲它是非關係數據庫。關於你的問題,你不必擔心,你可以做你所要求的一切。你只需要知道如何去做。關於你的問題:

「?好吧,我知道,我可以使用預測,但是否有可能使用的預測與查詢我能預料只是一個亞型的產品

是的,但不正常的方式。您可以嘗試的一種解決方案是篩選子類型,然後僅預測產品,如下所示:

db.products.find(「Name」:「TypeName」,「subtypes.name」:「SubtypeName」 },{「subtypes.products」:1})

這裏的問題是,這會給你一個所有類型爲「TypeName」的子類型及其產品列表的列表。所以這是錯誤的

您需要使用$elemMatch in the project來獲取你想要的產品列表:

db.products.find({ 「名」: 「類型名」, 「subtypes.name」: 「SubtypeName」},{ 「亞型」:{$ elemMatch:{ 「名稱」: 「SubtypeName」}}, 「subtypes.products」:1})

注意,$ elemMatch用於從查詢結果和限制的陣列字段只返回匹配的第一個元素。

在你暴露的用例中,我認爲這應該是解決方案。