2016-06-08 3 views
0

Это зависит от моей предыдущей проблемы. У меня есть коллекция под названием coln, где я храню поле, называемое обрешетками, в аббревиатурах: - mnfc для производства, sls для продаж.Данные Массирование с использованием агрегации

Моя совокупная структура должна считываться из этой коллекции и суммировать ее вместе с заменой этих аббревиатур их фактическими словами.

Смотрите код ниже: -

db.coln.aggregate(
    {$match: {"year" : "2010","companyName" :/ABC/}}, 
    {$unwind:"$hierarchy"}, 
    {$unwind:"$hierarchy.Details" }, 
    { 
     $group: 
     { "_id": 
      {"companyName": "$companyName", 
      "year": "$year", 
      "costHead": "$hierarchy.originalName"}, 
    "total": { "$sum": "$hierarchy.Details.values" }} 
    }, 
    {$project: {_id:0, "Firm":"$_id.companyName", "Year":"$_id.year", 
     "costHead": { $cond: { if: { $eq: [ "$_id.costHead", "Mnfc"] }, then:   "Manufacturing", else: "$_id.costHead" } }, 
     "Total":"$total" 
    }}, 
    {$project: {_id:0, "Firm":"$_id.companyName", "Year":"$_id.year", 
     "costHead": { $cond: { if: { $eq: [ "$_id.costHead", "Sls"] }, then:   "Sales", else: "$_id.costHead" } }, 
     "Total":"$total" 
    }}) 

Проблема с этим кодом является то, что он возвращает

{} {}

Однако если убрать второй последний проекция: (см. ниже) -

db.coln.aggregate(
    {$match: {"year" : "2010","companyName" :/ABC/}}, 
    {$unwind:"$hierarchy"}, 
    {$unwind:"$hierarchy.Details" }, 
    { 
     $group: 
     { "_id": 
      {"companyName": "$companyName", 
      "year": "$year", 
      "costHead": "$hierarchy.originalName"}, 
    "total": { "$sum": "$hierarchy.Details.values" }} 
    }, 
    {$project: {_id:0, "Firm":"$_id.companyName", "Year":"$_id.year", 
     "costHead": { $cond: { if: { $eq: [ "$_id.costHead", "Mnfc"] }, then:   "Manufacturing", else: "$_id.costHead" } }, 
     "Total":"$total" 
    }}) 

Я получаю 1 документ, который возвращается - всего 1 документ. Проецирование фильтрует оставшиеся документы.

Однако фильтр не то, что я хочу. Это типичный сценарий ETL, где я хочу, чтобы аббревиатуры были заменены их полными формами, прежде чем загружать их в целевую коллекцию. Существует не менее нескольких сотен документов, которые необходимо объединить и преобразовать.

Если я применяю проекцию, она отфильтровывает другие 50 документов. Я бы хотел, чтобы все эти документы отображались.

У кого-нибудь есть идеи?

+4

Вы могли бы предоставить пример документа? –

ответ

0

Удалось выяснить это. Проверьте код ниже: -

db.coln.aggregate(
{$match: {"year" : "2010","companyName" :/ABC/}}, 
{$unwind:"$hierarchy"}, 
{$unwind:"$hierarchy.Details" }, 
{ 
    $group: 
    { "_id": 
      {"companyName": "$companyName", 
      "year": "$year", 
      "costHead": "$hierarchy.originalName"}, 
    "total": { "$sum": "$hierarchy.Details.values" }} 
}, 
{$project: 
    {_id:0, "Firm":"$_id.companyName", "Year":"$_id.year","costPoint": 
    { $cond: { if: { $eq: [ "$_id.costHead", "Mnfc"] }, 
    then: "Manufacturing", else: 
    { $cond: { if: { $eq: [ "$_id.costHead", "sls"]}, then: "Sales", else: 0}}}},"Total":"$total"}}) 

Ключ должен был выяснить, как эффективно использовать эти условные операторы в Проекции. Похоже, для этого мне нужно всего 5 конвейеров.

Смежные вопросы