首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB ODM聚合生成器(最小值、最大值)-跳过0

MongoDB ODM聚合生成器(最小值、最大值)-跳过0
EN

Stack Overflow用户
提问于 2020-02-22 05:36:55
回答 3查看 139关注 0票数 1

我有一个订单表:

代码语言:javascript
复制
{ "_id" : 1, "customer" : "1", price: 0 }
{ "_id" : 2, "customer" : "1", price: 100 }
{ "_id" : 3, "customer" : "1", price: 120 }
{ "_id" : 4, "customer" : "2", price: 150 }

我想要得到每个客户的最小订单值。

代码语言:javascript
复制
$builder
    ->facet()
        ->field('customerOrders')
        ->pipeline(
           $dm->createAggregationBuilder('Document\Order')->group()
               ->field('id')
               ->expression('$customer')
               ->field('lowestValue')
               ->min('$price')
               ->field('highestValue')
               ->max('$price')
);

上面的代码可以工作。

代码语言:javascript
复制
{ "_id" : "1", "lowestValue" : 0,   "highestValue" : 120 }
{ "_id" : "2", "lowestValue" : 150, "highestValue" : 150 }

我想忽略价格为0或空的订单。

期望的结果:

代码语言:javascript
复制
{ "_id" : "1", "lowestValue" : 100, "highestValue" : 120 }
{ "_id" : "2", "lowestValue" : 150, "highestValue" : 150 }

这个是可能的吗?

我可以使用$cond (聚合)吗?

代码语言:javascript
复制
{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }

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

MongoDB 4.2

MongoDB ODM 2.0.3

EN

回答 3

Stack Overflow用户

发布于 2020-02-22 10:45:03

只需使用$gt开始您的管道: 0....that使用有效的文档启动数据集...

票数 1
EN

Stack Overflow用户

发布于 2020-02-22 17:18:59

根据Cahaba数据的建议,在分组之前过滤掉价格为0的订单。

代码语言:javascript
复制
db.orders.aggregate([
    {
        $match: { price: { $gt: 0 } }
    },
    {
        $group: {
            _id: "$customer",
            lowestValue: { $min: "$price" },
            highestValue: { $max: "$price" }
        }
    }
])
票数 0
EN

Stack Overflow用户

发布于 2020-03-08 08:02:07

谢谢你的回复。我找到了另一个解决方案。

代码语言:javascript
复制
db.orders.aggregate([
  {
    $group: {
      _id: "$customer",
      lowestValue: {
        $min: {
          $cond: [{
              $gt: ["$price", 0]
            }, "$price", null]
        }
      }
    }
  }
]);

理论聚合构建器

..。

代码语言:javascript
复制
->field('lowestValue')
->min($builder->expr()->cond($builder->expr()->gt('$price', 0), '$price', null))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60346522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档