MongoDB聚合中的lf-elseif-elseif-else

发布于 2018-05-25 作者 shen100 832次 浏览 版块 分享


MongoDB的$cond可以根据一个布尔表达式的值,来返回两个表达式中其中一个的返回值。
示例:
假设有一个库存集合(inventory) 以及如下的数据

{ "_id" : 1, "item" : "abc1", qty: 300 }
{ "_id" : 2, "item" : "abc2", qty: 200 }
{ "_id" : 3, "item" : "xyz1", qty: 250 }

如下的聚合操作,设置了一个字段discount, 当qty大于等于250时,discount的值为30,否则为20

db.inventory.aggregate(
   [
      {
         $project:
           {
             item: 1,
             discount:
               {
                 $cond: { if: { $gte: [ "$qty", 250 ] }, then: 30, else: 20 }
               }
           }
      }
   ]
)

返回如下的结果

{ "_id" : 1, "item" : "abc1", "discount" : 30 }
{ "_id" : 2, "item" : "abc2", "discount" : 20 }
{ "_id" : 3, "item" : "xyz1", "discount" : 30 }

再来看一下,如何使用if-elseif-elseif-else

db.inventory.aggregate([
    {
        $project: {
            item: 1,
            discount: {
                $cond: { 
                    if: { $lte: ['$qty', 100 ] }, 
                    then: 0, 
                    else: {
                        $cond: {
                            if: {  $and: [ { $gte: [ "$qty", 100 ] }, { $lt: [ "$qty", 200 ] } ] }, 
                            then: 10, 
                            else: {
                                $cond: {   
                                    if: {  $and: [ { $gte: [ "$qty", 200 ] }, { $lt: [ "$qty", 300 ] } ] }, 
                                    then: 20,
                                    else: 30
                                }
                            }
                        }
                    } 
                }
            }
        }
    }
])
收藏
暂无回复