2013-07-10 14 views
8

używam ramy agregacji MongoDB i trzeba podjąć bezwzględną wartość pola kwoty, które używam w obu części projektu, a część grupy, np:wartość bezwzględna z ram agregacji MongoDB

'$project' => { 
      'amount' => 1, 
      '_id' => 0 
     } 

....

'$group' => { 
     'total' => {'$sum' => '$amount'} 
    } 

Jak przyjmować wartość bezwzględną „kwota” pola w tym przypadku? I nie był w stanie go znaleźć w docs (może to nie jest dostępne?)

Odpowiedz

12

To nie jest bezpośrednio dostępna, ale można to zrobić za pomocą $cond operatora i $subtract obrębie $project tak (jako obiekt JavaScript) :

{ $project: { 
    amount: { 
    $cond: [ 
     { $lt: ['$amount', 0] }, 
     { $subtract: [0, '$amount'] }, 
     '$amount' 
    ] 
}}} 

Więc jeśli amount < 0, następnie 0 - amount jest używany, inaczej amount stosuje się bezpośrednio.

UPDATE

Począwszy od 3,2 wydaniu MongoDB, można użyć operatora new ekspresji $abs agregacji to zrobić bezpośrednio:

{ $project: { amount: { $abs: '$amount' } } 
+0

Perfect! Dzięki. – Mellop

+2

Lub, alternatywnie, powinieneś być w stanie '$ multiply' przez' -1': '{$ multiply: [-1, '$ amount']}' – WiredPrairie

+0

@AshutoshPriyadarshy ((-1) * (- 1))/(- 1) jest nadal -1, więc jest niepoprawny. – joao

Powiązane problemy