2015-11-27 3 views
1

Два документа из моей коллекции выглядеть следующим образом:

Первый документ

{ 
"_id" : 2055, 
"counervalues" : { 
    "chcounter" : 3 
    "bscounter" : 10 
    } 
"attributionvalues" :[ 
{ 
    "id" : 1 
    "conversionvalue" : 85.0 
    "conversioncounter" : 6300.0 
}, 
{ 
    "id" : 2 
    "conversionvalue" : 25.0 
    "conversioncounter" : 600 
} 
} 

Второй документ

{ 
"_id" : 1046, 
"counervalues" : { 
    "chcounter" : 23 
    "bscounter" : 46 
    } 
"attributionvalues" :[ 
{ 
    "id" : 1 
    "conversionvalue" : 15.0 
    "conversioncounter" : 275.0  
}, 
{ 
    "id" : 2 
    "conversionvalue" : 65.0 
    "conversioncounter" : 12000.0 
} 
} 

Сейчас я хотите применить структуру агрегации, чтобы получить новый документ, который имеет результат:

Результат

{ 
"_id" : 3005, 
"counervalues" : { 
    "chcounter" : 26 
    "bscounter" : 56 
    } 
"attributionvalues" :[ 
{ 
    "id" : 1 
    "conversionvalue" : 100.0 
    "conversioncounter" : 6575.0  
}, 
{ 
    "id" : 2 
    "conversionvalue" : 90.0 
    "conversioncounter" : 12600.0 
} 
} 

Я начал свою агрегацию так:

db.conversion.counters.aggregate({ 
    $match: 
    { 
     "_id" : {"$gte" : 1046 , "$lte" : 2055} 
    } 
    $group: 
    { 
     cvchc: {$sum: "$counervalues.chcounter"} 
     cvbsc: {$sum: "$counervalues.bscounter"} 
    } 
}); 

, но у меня есть проблемы, чтобы соответствовать attributionvalues ​​в соответствии с их идентификаторами и добавить их.

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

+0

Как вы получите '_id' в результате? Это не сумма двух предыдущих документов. –

+0

Я уверен, что это невозможно в оболочке - вам нужно сделать это в своем приложении. Возможно, вы могли бы написать пользовательскую функцию mapReduce, но опять же, вы могли бы также сделать это в своем приложении. –

+0

@DavidGrinberg _id не имеет значения, я бы добавил его через свое приложение. Я использую оболочку только для ускорения работы. В моем приложении я использую весенние данные, которые поддерживают структуру агрегации. Я мог бы сделать это в своем приложении, конечно, но, как правило, в mongodb вы получаете огромное количество результатов, и я думал, что структура агрегации будет быстрее, чем повторение через них в приложении. –

ответ

1

Выполните следующую агрегацию трубопровода, должны дать вам желаемые результаты:

db.conversion.aggregate([ 
    { "$match": { "_id" : { "$gte" : 1046 , "$lte" : 2055 } } }, 
    { "$unwind": "$attributionvalues" }, 
    { 
     "$group": { 
      "_id": "$attributionvalues.id", 
      "cvchc": { "$sum": "$counervalues.chcounter" }, 
      "cvbsc": { "$sum": "$counervalues.bscounter" }, 
      "avcv": { "$sum": "$attributionvalues.conversionvalue" }, 
      "avcc": { "$sum": "$attributionvalues.conversioncounter" } 
     } 
    }, 
    { 
     "$group": { 
      "_id": null, 
      "chcounter": { "$first": "$cvchc" }, 
      "bscounter" : { "$first": "$cvbsc" }, 
      "attributionvalues": { 
       "$push": { 
        "id": "$_id", 
        "conversionvalue": "$avcv" , 
        "conversioncounter": "$avcc" 
       } 
      }   
     } 
    }, 
    { 
     "$project": { 
      "counervalues": { 
       "chcounter": "$chcounter", 
       "bscounter": "$bscounter" 
      }, 
      "attributionvalues": 1 
     } 
    } 
]) 
+1

Большое вам спасибо, это именно то, что я искал. –

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