1

これらは私の文書である:マングースの集計:_idないフィールドを返す

{shopId: "aaa", customerId: "bbb", customerName: "xxx", value: 12} 
{shopId: "aaa", customerId: "ccc", customerName: "yyy", value: 12} 
{shopId: "aaa", customerId: "bbb", customerName: "xxx", value: 12} 
{shopId: "ddd", customerId: "bbb", customerName: "xxx", value: 12} 

私は与えられた顧客が選択したお店で過ごしたどのくらいのお金を知りたいです。

私はそれを行う方法を知っている:

Docs.aggregate(
    [{ $match: { shopId: selectedShop } }, 
     { 
      $group: { 
        _id: "$customerId", 
        totalVisits: { $sum: 1 }, 
        totalValue: { $sum: "$value" } 
       } 
      } 
     ], function (err, result) { 
      if (err) { 
       // 

      } else { 
       // 

      } 
     } 
    ); 

問題は、私が得る結果は_id: "$customerId"フィールドが含まれていると私はcustomerNameを取得し、customerIdを非表示にすることです。

可能ですか?

答えて

1

$projectオペレーターを見て、ステージの後半でフィールドを非表示にしてください。

要約:顧客IDを隠すために、パイプラインに次のようなものを追加します。

{ $project : { _id : 0, totalVisits : 1 , totalValue : 1 } } 

お客様の名前を含めるには、グループオペレーターで$firstを使用できます。

お客様の名前を入力して顧客IDを非表示にする場合は、顧客名をグループ化するだけではいかがですか?

+0

お客様の名前は一意ではないため、私はそれをグループ化することはできません。 –

+0

ああ、私はちょうどあなたの質問のダミーのデータのためにそれを仮定:) – DAXaholic

1

あなたはほぼそこにいます。 "customerName"を取得するには、$groupステージに$firstまたは$lastアキュムレータ演算子を使用する必要があります。もちろん

Docs.aggregate(
    [ 
     { $match: { shopId: selectedShop } }, 
     { $group: { 
      "_id": "$customerId", 
      "totalVisits": { $sum: 1 }, 
      "totalValue": { $sum: "$value" }, 
      "customerName": { $first: "$customerName" } 
     }} 
    ], function (err, result) { 
     if (err) { 
      // 
     } else { 
      // 
     } 
     } 
); 

あなたが_idフィールドを使用しない場合は、常に$project、ステージを追加することができますが、それは、パフォーマンスの低下の原因となります。

関連する問題