2017-07-04 20 views
0

すべての割引製品を含むカタログを入手したいと考えています。Mongodb:各要素にデータを集約して適用する

2文書:

/* Catalog schema */ 
{ 
    Catalog: { 
    products: [{ 
     type: ObjectId, 
     ref: 'Product' 
    }], 
    discount: { 
    global: { type: Number, default: 0 }, 
    categories: [{ 
     codeCategory: String, 
     discount: Number 
    }] 
} 
} 


/* Product schema */ 
{ 
    reference: { 
    type: String, 
    index: true, 
    unique: true 
    }, 
    url_photo: { 
    type: String, 
    default: 'http://localhost:3001/app/img/no-picture.jpg' 
    }, 
    category: { 
    type: ObjectId, 
    ref: 'Category' 
    }, 
    short_description: String, 
    long_description: String, 
    price: Number, 
    information: String 
} 

割引はカタログから各製品に適用され、どのように私はモンゴでクエリが適用される割引とカタログ内のすべての製品を取得するために作ることができますか?

この結果を得るために直接問い合わせることはできますか?

私は既に集計でチェックしていますが、私はそれが新しいので、どうすればこのことができるのか分かりません。

ありがとう

+0

割引額を投影することによって、その後そのインデックスのカテゴリを見つけるために$arrayElemAtを使用して、カテゴリにマッチのインデックスを検索し$indexOfArrayを使用しますか?同じコレクションで?どのようなドライバを使用していますか?マングース、ピモンゴなど?私が推測しなければならないのは、あなたがマングースを使ってNodeアプリをやっていると言うでしょう。 – dasdachs

+0

カタログ、製品およびカテゴリは別々のコレクションです。私はマングースを使用しています。あなたはそれがノードアプリケーションだと思うでしょう。 – stephane

+0

カタログスキーマに2つの「割引」があるのはなぜですか? – dasdachs

答えて

2

3.4パイプラインで以下の集計を使用できます。 catalog.productsパスでカテゴリの製品データを引き出し、各製品の価格に割引を適用し、informationフィールドに示されているように類似し、すべての製品分野を含めるように$mapを使用する

$lookup$addFieldsは、割引価格でproducts配列を上書きします。

カタログに一致する商品カテゴリがある場合は、カテゴリレベルのディスカウントを追加します。見つかった場合は、文書が保存されている他の0

[ 
    { 
    "$lookup": { 
     "from": "products", 
     "localField": "catalog.products", 
     "foreignField": "_id", 
     "as": "catalog.products" 
    } 
    }, 
    { 
    "$addFields": { 
     "catalog.products": { 
     "$map": { 
      "input": "$catalog.products", 
      "as": "product", 
      "in": { 
      "price": { 
       "$multiply": [ 
       "$$product.price", 
       { 
        "$add": [ 
        "$catalog.discount.global", 
        { 
         "$let": { 
         "vars": { 
          "index": { 
          "$indexOfArray": [ 
           "$catalog.discount.categories.codeCategory", 
           "$$product.category" 
          ] 
          } 
         }, 
         "in": { 
          "$cond": [ 
          { 
           "$eq": [ 
           "$$index", 
           -1 
           ] 
          }, 
          0, 
          { 
           "$let": { 
           "vars": { 
            "categorydisc": { 
            "$arrayElemAt": [ 
             "$catalog.discount.categories", 
             "$$index" 
            ] 
            } 
           }, 
           "in": "$$categorydisc.discount" 
           } 
          } 
          ] 
         } 
         } 
        } 
        ] 
       } 
       ] 
      }, 
      "information": "$$product.information" 
      } 
     } 
     } 
    } 
    } 
] 
+0

こんにちはVeeramは、グローバルディスカウントのリクエストです。カテゴリ割引がある場合、どのようにproduct.categoryとディスカウントカテゴリを一致させることができますか? – stephane

+0

ようこそ。カテゴリレベルの割引を調整するロジックを追加しました。 – Veeram

+0

Wonderfull !!! 私のような初心者モンゴーのために、あなたはただ私を怖がらせました!しかし、私はあなたが素晴らしい人であるmongoでリクエストを作成するためにどのように考えなければならないかをもっと理解しています!あなたがこのリクエストにしたように値を格納する方が良いですか、カタログを送る必要があるときに値引き値を取得するようリクエストするだけですか?私の質問はperfに基づいています – stephane

関連する問題