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 { 
      // 
     } 
     } 
); 

當然,你可以隨時添加一個$project階段,如果你不希望_id領域,但它會導致性能的降低。