2017-05-18 14 views
0

以下は、特定の色に対して使用可能なすべてのサイズを含むTShirtsのサンプルデータです。

{ 
    _id: '591c0e588834491a10a584ef', 
    prdctName: 'TShirt', 
    ColorRed: [38, 40, 42, 44, 46, 48], 
    ColorPink: [38, 40, 42, 44, 46, 48],  
    ColorOrange: [38, 40, 42, 44, 46, 48] 
} 

指定されたサイズに対していくつのTShirtsがあるかを計算したいと思います。 例:さまざまな色でサイズ '38'に使用できるTSシャツの総数を確認したいです。

ありがとうございます!

+0

本当にあなたにはたくさんの人がいます。たとえば、現在のサンプルには何枚のTシャツがあることを意味していますか?与えられたサイズのための色の選択を与えられた "3"はありますか?コレクション内のすべての文書で色が一致していますか?すべての可能なカラーキーの名前を知っていますか?あなたはこのデータフォーマットに献身しているのか、ニーズに最もよく構造化するためのオプションを探していますか?これらはあなたの質問から欠けているすべてのものであり、明確になり、あなたが望む結果を得るためです。仕事が必要です。 –

+0

「ColorRed」、「ColorPink」、「ColorOrange」という名前のフィールドで表される3つの色があります。各カラーフィールド(ColorPinkなど)には38,40,42,44,46,46のサイズが含まれている場合と含まれていない場合があります。したがって、現在の例では、TShirtの総数は3フィート* 6サイズ= 18TShirtsです。構造を変更するための範囲はありません。 – ravik

答えて

0

基本的に、商品ごとにフィルタをかけ、すべてのサイズを巻き戻して、選択したサイズのカウントを見つける必要があります。私の心に来る最初のクエリは:

db.getCollection('products').aggregate([ 
    { $match: {prdctName:"TShirt"}}, 
    { $project: { prdctName:"$prdctName", allColors: { $concatArrays: [ "$ColorRed", "$ColorPink", "$ColorOrange" ] }} }, 
    { $unwind: "$allColors"}, 
    { $match: { allColors: 38 }}, 
    { $group: { _id: "$prdctName", count:{$sum:1}}}, 
]) 

P.S.です。それは最適なものではないかもしれませんが、始めるべきことです。

0

私が見ることができる最も効率的に$sum単に残りのアレイの$sizeと一致した要素に低減する$concatArrays$filterを使用している:

db.collection.aggregate([ 
    // Only match potential documents 
    { "$match": { 
    "prdctName": "TShirt", 
    "$or": [ 
     { "ColorRed": 38 }, 
     { "ColorPink": 38 }, 
     { "ColorOrange": 38 } 
    ] 
    }}, 
    // Group and count the matching elements from the combined arrays 
    { "$group": { 
    "_id": "$prdctName", 
    "count": { 
     "$sum": { 
     "$size": { 
      "$filter": { 
      "in": { "$concatArrays": [ "$ColorRed", "$ColorOrange", "$ColorPink" ] }, 
      "as": "el", 
      "cond": { "$eq": [ "$$el", 38 ] } 
      } 
     } 
    } 
    }} 

]) 

それの効率的な二段階プロセスなします可能性のある一致する文書をフィルタリングしてから1回のパスで蓄積します。

関連する問題