1

это мои документы:Mongoose агрегат: возвращение не _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, чтобы скрыть поля позже на сцене.

Вкратце: добавьте что-то вроде следующего в ваш конвейер, чтобы скрыть ваш идентификатор клиента.

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

Чтобы добавить имя клиента, вы можете использовать $first у оператора вашей группы.

Если вы хотите указать имя клиента и скрыть идентификатор клиента, то почему бы просто не группировать имя клиента?

+0

Имя клиента не уникально, поэтому, я думаю, я не могу сгруппировать по этому вопросу. –

+0

Ah ok - Я просто предположил, что из-за фиктивных данных в вашем вопросе :) – DAXaholic

1

Вы почти находитесь. Для получения «customerName» вам необходимо использовать операционный аккумулятор $first или $last на вашем этапе $group.

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 поля, но это приводит к падению производительности.