mongodb的aggregate
2017-12-18 本文已影响0人
firststep
前奏:首先接触到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之前。因为需要先排序好再进行操作。