2016-11-21 2 views
1

У меня есть коллекция счета-фактура ...Как получить этот результат с заполнителем в MongoDB

{ 
"_id" : 1, 
"items" : [ 
    { 
     "_id" : 1, 
     "value" : 100, 
     "price" : 9500 
    }, 
    { 
     "_id" : 2, 
     "value" : 200, 
     "price" : 9500 
    } 
], 
"costs" : [ 
    { 
     "_id" : 1, 
     "price" : 100 
    }, 
    { 
     "_id" : 2, 
     "price" : 150 
    }, 
    { 
     "_id" : 3, 
     "price" : 250 
    } 
]} 

я получаю сумму счета-фактуры с агрегатным ...

Другими словами =>

{ $ sum: {$ multiply: {[$ items.value, $ items.price]}}} - {$ sum: "$ costs.price"};

{ 
    "_id" : 1, 
    "amount" : 2849500 
} 

очень думает ...

;-)

+0

В чем Ваш вопрос? – styvane

ответ

3

Монго 3,4 Версия

$ Карты умножить значение цен & элемента и $ уменьшить, чтобы вычислить сумму деталь цена & стоимость и $ уменьшить, чтобы рассчитать сумму стоимости. $ вычесть значения из более раннего сокращения, чтобы получить окончательную сумму.

aggregate([{ 
    $project: { 
     _id: 1, 
     amount: { 
      $subtract: [{ 
       $reduce: { 
        input: { 
         $map: { 
          input: "$items", 
          as: "item", 
          in: { 
           $multiply: ["$$item.value", "$$item.price"] 
          } 
         } 
        }, 
        initialValue: 0, 
        in: { 
         $add: ["$$value", "$$this"] 
        } 
       } 
      }, { 
       $reduce: { 
        input: "$costs.price", 
        initialValue: 0, 
        in: { 
         $add: ["$$value", "$$this"] 
        } 
       } 
      }] 
     } 

    } 
}]) 

Монго 3.x Версия

Первый $ проект умножить значение & цена элемента. Следующая группировка для вычисления суммы для обоих позиций и полей затрат, что приведет к одному значению массива для каждого элемента и поля затрат, а окончательный проект будет рассматривать только значение массива из обоих массивов с помощью $ arrayElemAt, чтобы вычесть значения друг из друга.

aggregate(
    [{ 
     $project: { 
      vpItems: { 
       $map: { 
        input: "$items", 
        as: "item", 
        in: { 
         $multiply: ["$$item.value", "$$item.price"] 
        } 
       } 
      }, 
      costs: '$costs' 
     } 
    }, { 
     $group: { 
      _id: '$_id', 
      vpItems: { 
       $addToSet: { 
        $sum: '$vpItems' 
       } 
      }, 
      pCosts: { 
       $addToSet: { 
        $sum: '$costs.price' 
       } 
      } 
     } 
    }, { 
     $project: { 
      _id: 1, 
      amount: { 
       $subtract: [{ 
        $arrayElemAt: ["$vpItems", 0] 
       }, { 
        $arrayElemAt: ["$pCosts", 0] 
       }] 
      } 
     } 
    }]) 

Монго 2,6 Версия

$ раскручивать элементы и группа в calcualte суммы значений, возвращаемых из умножения значения цен & элемента и $ размотать затраты для расчета суммы цен & стоимости и проект элемента в $ вычитают значения из предыдущей группировки для расчета конечной суммы.

aggregate([{ 
     $unwind: '$items' 
    }, { 
     $group: { 
      _id: '$_id', 
      totalItems: { 
       $sum: { 
        $multiply: ["$items.value", "$items.price"] 
       } 
      }, 
      costs: { 
       $first: '$costs' 
      } 
     } 
    }, { 
     $unwind: '$costs' 
    }, { 
     $group: { 
      _id: '$_id', 
      totalItems: { 
       $first: '$totalItems' 
      }, 
      totalPrice: { 
       $sum: '$costs.price' 
      } 
     } 
    }, { 
     $project: { 
      _id: 1, 
      amount: { 
       $subtract: ['$totalItems', '$totalPrice'] 
      } 
     } 
    }]) 
+0

спасибо моему другу. но эта ошибка для $ sum: "errmsg": "exception: invalid operator '$ sum'", "code": 15999 –

+0

Я запустил его на 3.2. Какую версию mongodb вы используете? – Veeram

+0

Версия MongoDB: 2.6.10 –

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