2016-03-24 6 views
7

と一致しませんids(56e641d4864e5b780bb992c6および56e65504a323ee0812e511f2)で商品を表示し、値引きを引いて割引を引いた後に表示したいと考えています。

は私が集計を使用して、最終的な価格を数えることができますが、この戻りコレクション内のすべての文書は、どのようにそれが唯一の試合のid

"_id" : ObjectId("56e641d4864e5b780bb992c6"), 
"title" : "Keyboard", 
"discount" : NumberInt(10), 
"price" : NumberInt(1000) 

"_id" : ObjectId("56e65504a323ee0812e511f2"), 
"title" : "Mouse", 
"discount" : NumberInt(0), 
"price" : NumberInt(1000) 

"_id" : ObjectId("56d90714a48d2eb40cc601a5"), 
"title" : "Speaker", 
"discount" : NumberInt(10), 
"price" : NumberInt(1000) 

を返すようにするために、これは私のクエリです

productModel.aggregate([ 
     { 
      $project: { 
       title : 1, 
       price: { 
        $cond: { 
         if: {$gt: ["$discount", 0]}, then: {$subtract: ["$price", {$divide: [{$multiply: ["$price", "$discount"]}, 100]}]}, else: "$price" 
        } 

       } 
      } 
     } 
    ], function(err, docs){ 
     if (err){ 
      console.log(err) 
     }else{ 
      console.log(docs) 
     } 
    }) 

と私はこの$inクエリを追加する場合、それは

productModel.aggregate([ 
      { 
       $match: {_id: {$in: ids}} 
      }, 
      { 
       $project: { 
        title : 1, 
        price: { 
         $cond: { 
          if: {$gt: ["$discount", 0]}, then: {$subtract: ["$price", {$divide: [{$multiply: ["$price", "$discount"]}, 100]}]}, else: "$price" 
        } 

       } 
      } 
     } 
    ], function(err, docs){ 
     if (err){ 
      console.log(err) 
     }else{ 
      console.log(docs) 
     } 
    }) 

答えて

11
空の配列を返します。

ids変数は "文字列"で構成され、ObjectId値ではありません。

ObjectIdのマングース「オートキャスト」文字列の値は、通常のクエリでは正しいタイプになりますが、問題番号1399に記載されているようにdoes not happen in the aggregation pipelineです。

代わりに手動で入力する正しい鋳造を行う必要があります。

ids = ids.map(function(el) { return mongoose.Types.ObjectId(el) }) 

次に、あなたがあなたのパイプラインステージでそれらを使用することができます。

{ "$match": { "_id": { "$in": ids } } } 

集約パイプラインは「一般的に」変更するための理由がありますしたがって、マングースは、「スキーマ」が任意のパイプライン段階の文書に適用されることを推測しません。

$matchステージの「最初の」パイプラインステージは、実際にはドキュメントが変更されていないため、これを実行する必要があります。しかし、今はこれがどうして起こるかではありません。

「文字列」であったり、少なくとも正しいBSONタイプではない値は、一致させるために手動でキャストする必要があります。

+0

これで終わりです。しかし、通常はidをfindOneAndUpdateや他のクエリの文字列としてスローします。問題は集約でしか起こりませんか? –

+1

@MuhammadFasalirRahmanこれはまさに私が答えたものです。 '.find()'は 'Schema'を使うことができます。もちろん' _id'フィールドには 'ObjectId'のデフォルトタイプがあります。私が実際に説明したように、集約パイプラインは 'Schema'を使用しません**。 –

+0

これはマングース5で動作していません –

関連する問題