MongoDB ODM Агрегационный построитель (мин., Макс.) - пропустить 0 - PullRequest
1 голос
/ 22 февраля 2020

У меня есть таблица заказов:

{ "_id" : 1, "customer" : "1", price: 0 }
{ "_id" : 2, "customer" : "1", price: 100 }
{ "_id" : 3, "customer" : "1", price: 120 }
{ "_id" : 4, "customer" : "2", price: 150 }

Я хочу получить минимальную стоимость заказа для каждого клиента.

$builder
    ->facet()
        ->field('customerOrders')
        ->pipeline(
           $dm->createAggregationBuilder('Document\Order')->group()
               ->field('id')
               ->expression('$customer')
               ->field('lowestValue')
               ->min('$price')
               ->field('highestValue')
               ->max('$price')
);

Приведенный выше код работает.

{ "_id" : "1", "lowestValue" : 0,   "highestValue" : 120 }
{ "_id" : "2", "lowestValue" : 150, "highestValue" : 150 }

Я хочу игнорировать ордера с ценой 0 или ноль.

Желаемый результат:

{ "_id" : "1", "lowestValue" : 100, "highestValue" : 120 }
{ "_id" : "2", "lowestValue" : 150, "highestValue" : 150 }

Возможно ли это? Могу ли я использовать $ cond (агрегат)?

{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }

https://docs.mongodb.com/manual/reference/operator/aggregation/cond/

MongoDB 4.2 MongoDB ODM 2.0.3

Ответы [ 3 ]

1 голос
/ 22 февраля 2020

просто начните свой конвейер с $ gt: 0 ...., который начинает набор данных с допустимых документов ...

0 голосов
/ 08 марта 2020

Спасибо за ответы. Я нашел другое решение.

db.orders.aggregate([
  {
    $group: {
      _id: "$customer",
      lowestValue: {
        $min: {
          $cond: [{
              $gt: ["$price", 0]
            }, "$price", null]
        }
      }
    }
  }
]);

Doctrine Aggregation Builder ...

->field('lowestValue')
->min($builder->expr()->cond($builder->expr()->gt('$price', 0), '$price', null))
0 голосов
/ 22 февраля 2020

в соответствии с рекомендациями Cahaba Data, перед группировкой отфильтруйте заказы с ценой 0.

db.orders.aggregate([
    {
        $match: { price: { $gt: 0 } }
    },
    {
        $group: {
            _id: "$customer",
            lowestValue: { $min: "$price" },
            highestValue: { $max: "$price" }
        }
    }
])
...