mongodb的aggregate

前奏:首先接触到mongodb的时候总是感觉不如sql语言用着舒服,但是当你用的熟悉了会发现其实语法都是差不多的。sql元的逻辑性更强些,而mongodb这些nosql语言则更加灵活。

一、mongodb常用到的就是聚合函数,首先的例子是根据创建时间聚合过滤出年份为2017年,月份为12月的数据。其中“year_data”是自己定义的年份所显示的字段名,name和sex是设置显示这连个字段。

match:用于过滤数据,只输出符合条件的文档。

db.getCollection('表名').aggregate([
    { 
        $project: { 'year_data': {$year: "$createdAt"},'month_data': {$month: "$createdAt"}, 'name':1, sex: 1}},
        {$match: {"year_data": 2017,  "month_data" : 12}
    }
])

二、显示条数limit。

由于在真正的项目开发中分页是必须会用到的,因为不可能让用户一页把所有的数据显示完。所以我们就会用到limit限制条数。

db.getCollection('表名').aggregate([
    { 
        $project: { 'year_data': {$year: "$createdAt"},'month_data': {$month: "$createdAt"}, 'name':1, sex: 1}},
        {$match: {"year_data": 2017,  "month_data" : 12},
        {$limit: 10}
    }
])

这样设置就会显示一页显示10条数据。

三、skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。

虽然limit可以控制一页显示多少条数据,但是如何区分那一页还是一个需要解决的问题。而skip就可以帮我们很好的解决这个问题。

db.getCollection('表名').aggregate([
    { 
        $project: { 'year_data': {$year: "$createdAt"},'month_data': {$month: "$createdAt"}, 'name':1, sex: 1}},
        {$match: {"year_data": 2017,  "month_data" : 12},
        {$skip: 10},
        {$limit: 10}
        
    }
])

这样查询数据的时候就是跳过前十条记录再查询十条记录,也就是11-20条。也就是第二页。这样就做到了分页的效果。

四:sort:将输入文档排序后输出。

由于再做分页的时候不能随便查询数据,需要按照一定的顺序排列然后进行一些过滤等操作。这样才能保证数据的真实性。

db.getCollection('表名').aggregate([
  { 
      $project: { 'year_data': {$year: "$createdAt"},'month_data': {$month: "$createdAt"}, 'name':1, sex: 1}},
      {$match: {"year_data": 2017,  "month_data" : 12},
      {$sort: {"yearData" => :-1, "monthData" : -1}}
      {$skip: 10},
      {$limit: 10}
      
  }
])

-1降序,1为升序。sort需要在skip,limit之前。因为需要先排序好再进行操作。

推荐阅读更多精彩内容