2016-01-18 61 views
2

我有一個集合products相關文件(產品)這樣的(唯一相關的代碼):蒙戈彙總查詢面導航

{ "_id": "prod1", ... "colors": ["red","blue"], "size": ["S", "M"], ...} 
{ "_id": "prod2", ... "colors": ["red","green"], "size": ["S", "XL"], ...} 
{ "_id": "prod3", ... "colors": ["yellow","blue"], "size": ["XL", "XXL"], ...} 

我想向用戶提供唯一可用的選擇,作爲一個面搜索,就像選項的名稱和可用選項的數量一樣。

顏色:

red 2 
blue 2 
green 1 
yellow 1 

尺寸:

S 2 
M 1 
XL 2 
XXL 1 

如果我不得不這樣做在SQL,我可能會運行每個面組查詢。

SELECT colors, count(*) AS number FROM products GROUP BY colors 

比第二查詢

SELECT size, count(*) AS number FROM test GROUP BY sizes 

如果有人選擇了 「紅色」,比我可能會添加到每個查詢的 「WHERE」 子句:

WHERE colors = 'red' 
莫非

有人比我更有經驗,請幫我在MongoDB中使用這個例子?我是否必須運行兩個查詢,或者是否有一些我缺少的內容,並且可以在一個查詢中完成?我想我會有很多產品。任何幫助讚賞。特別是如果有任何技巧來加速它。我想從頭開始,因此提出這個問題。謝謝。

+0

你在什麼版本的MongoDB上? – styvane

回答

1

的$神奇放鬆

當你需要計算的東西,是爲你必須先解開它的陣列。看看這個:

db.products.aggregate([ { $unwind : "$colors" }]) 

它爲每個數組項產生一個行。

一旦你放鬆它,你可以管下一組:

db.products.aggregate([ 
{ $unwind : "$colors" }, 
{$group: { _id : "$colors", total_colors : { $sum : 1} } } 
]) 

名稱,如你所願聚合領域:)同樣可以歸納爲你需要的大小來完成。

1
db.entry.aggregate([ 
{$unwind : "$size" }, 
{$group: { "_id" : "$size", count : { $sum : 1 } } } 
]).pretty() 

希望這會有所幫助,如你所願的「計數」字段和$放鬆定義您可以自定義:

解構數組字段從輸入文檔輸出爲每個元素的文檔。每個輸出文檔都是由元素替換的數組字段值的輸入文檔。

https://docs.mongodb.org/manual/reference/operator/aggregation/unwind/

1

面搜索被MongoDB中數據的基礎上的3.4版本中實現。

{ $facet: 
    { 
     <outputField1>: [ <stage1>, <stage2>, ... ], 
     <outputField2>: [ <stage1>, <stage2>, ... ], 
     ... 

    } 
} 

這是link to documentation

2

下面是MongoDB聚合查詢的解決方案。以下是我的虛擬收藏。

{ 
     "_id" : ObjectId("584b82055855b8ea7ea29d65"), 
     "colors" : [ 
      "Red", 
      "Yellow" 
     ], 
     "size" : [ 
      "S", 
      "M" 
     ] 
    } 
    { 
     "_id" : ObjectId("584b82185855b8ea7ea29d66"), 
     "colors" : [ 
      "Red", 
      "Orange" 
     ], 
     "size" : [ 
      "S", 
      "XL" 
     ] 
    } 
. 
. 

運行下面的查詢後。

db.getCollection('products').aggregate([ 
    {$unwind : "$colors"}, 
    {$group : { 
     _id : "$colors", 
     "sum": {$sum : 1} 
    }}, 
    { 
     $project : { 
      _id : 0, 
      "color":"$_id", 
      "count":"$sum" 
     } 
    } 
]) 

然後輸出爲:

{ 
    "color" : "Green", 
    "count" : 2 
} 
{ 
    "color" : "Orange", 
    "count" : 1 
} 
{ 
    "color" : "Yellow", 
    "count" : 2 
} 
{ 
    "color" : "Red", 
    "count" : 2 
} 

如果你想找到總和僅爲顏色然後在下面的查詢該

db.getCollection('products').aggregate([ 
    {$unwind : "$colors"}, 
    {$match : {"colors":"Red"}}, 
    {$group : { 
     _id : "$colors", 
     "sum": {$sum : 1} 
    }}, 
    { 
     $project : { 
      _id : 0, 
      "color":"$_id", 
      "count":"$sum" 
     } 
    } 
]) 

上述查詢的輸出是:

{ 
    "color" : "Red", 
    "count" : 2 
}