Aggregation-聚合查询

Aggregation:

参数说明:sql(Operators)

     where ($match) 、group by ($group) 、having($match)、select($project)、order by($sort)、limit($limit)

     sum($sum)、count($sum)、join($lookup)

MongoVUE操作:

	SELECT cust_id,
       		SUM(price) as total
	FROM orders
	WHERE status = 'A'
	GROUP BY cust_id
	HAVING total > 250
db.orders.aggregate( [
   { $match: { status: 'A' } },
   {
     $group: {
        _id: "$cust_id",
        total: { $sum: "$price" }
     }
   },
   { $match: { total: { $gt: 250 } } }
] )

统计页面的PV、UV和独立IP

{

$project:{子查询--对日期进行处理、获取所有cookId和ip

ord_day:{

year:{$year:"$createTime"},

month:{$month:"$createTime"},

day:{$dayOfMonth:"$createTime"},

},

cookId:"$cookId",

ip:"$ip"

}

},

{

$group:{处理子查询的结果,对日期进行分组

_id:"$ord_day",

users:{$addToSet:"$cookId"},

ips:{$addToSet:"$ip"},

total:{$sum:1}

}

},

{

$project:{

_id:"$_id",

pv:"$total",

uv:{$size:"$users"},

ip:{$size:"$ips"}

}

}

JAVA代码实现:

Aggregation aggregation = Aggregation.newAggregation(
    Aggregation.match(criteria),
    Aggregation.project(fields),
    Aggregation.group(fields),
    Aggregation.sort(sort),
    Aggregation.skip(elementsToSkip),
    Aggregation.limit(maxElements)
    );
    mongoTemplate.aggregate(aggregation, collectionName, outputType)

例如:

Aggregation aggregation = Aggregation.newAggregation(
        Aggregation.match(Criteria.where("status").is("A")),
        Aggregation.group("cust_id").sum("price").as("total"),
        Aggregation.match(Criteria.where("total").gt(250))
        );
        mongoTemplate.aggregate(aggregation, collectionName, outputType)

https://blog.csdn.net/forget_fg1/article/details/53524294?utm_source=copy

你可能感兴趣的:(mongodb)