zoukankan      html  css  js  c++  java
  • mongodb实战聚合 组内排序

    前言

    今天遇到的需求,使得我需要在聚合分组中的组内进行排序。

    网上搜索了一番,mongodb并没有组内排序的关键字。好像sql有; 
    瞬间对mongodb有点失望。 
    后来仔细想想,虽然数据库层面没有具体关键字去实现,但是,我们可以在写管道时,控制好顺序是可以实现组内排序的;

    数据

    假设我们现在有下面这样的数据:

    这里写图片描述

    每个奖项名为一组,每组都有名次,希望按照这些名次进行排序。

    思路

    虽然mongodb并没有提供组内排序的相应字段; 
    我们可以先对奖项名称进行排序,这样就把相同奖项都排列到一起了。 
    此时我们再对名次进行排序,这样就实现了对组内的排序。

    代码

    基于我的业务的完整的代码

    db.newfortune_best_analyst.aggregate([
        {$match:{year:2017}},
        //{$sort:{awardcode:-1,ranking:1}},
        {$sort:{awardcode:-1}},
        { $group:{
            _id:{
                code:"$awardcode"
                , ranking:"$ranking"
            }
    	    , organ_name:{$push:"$organ_name"}
    		, awardcode:{$first:"$awardcode"}
    		, awardname:{$first:"$awardname"}
    		, ranking: {$first:"$ranking"}
    		}
    	},
        {$sort:{awardcode:-1,ranking:1}},
    ])

    讲解:

    {$sort:{awardcode:-1}},

    这个排序很关键,其会对奖项编号进行排序; 
    原本我是{$sort:{awardcode:-1,ranking:1}},这么写的, 
    但是后面的ranking在下个管道$group分组中使用$addToSet后,顺序就会发生变化, 
    所以还不如不用。

    _id:{code:"$awardcode",ranking:"$ranking"}

    之后,再按照奖项编号和名次进行分组, 
    但是此时得到数据,由于分组的原因,组内的顺序变化了; 
    所以我们需要在最后再次进行排序,这样就是我们想要的数据。

    {$sort:{awardcode:-1,ranking:1}},

    效果:

    这里写图片描述

    总结

    组内分组 通过一些技巧还是可以实现的; 
    第一步,把分组的主键都归在一起,再去聚合排序,就可以;

  • 相关阅读:
    PythonStudy——数据类型总结 Data type summary
    PythonStudy——可变与不可变 Variable and immutable
    PythonStudy——列表操作 List operatio
    PythonStudy——列表的常用操作 List of common operations
    PythonStudy——列表类型 List type
    PythonStudy——字符串扩展方法 String extension method
    PythonStudy——字符串重要方法 String important method
    AWT,Swing,RCP 开发
    JQuery插件机制
    最新知识网站
  • 原文地址:https://www.cnblogs.com/grj001/p/12224198.html
Copyright © 2011-2022 走看看