在MongoDB中,要做到像之前SQL中一樣的查詢,簡單的還可以,複雜的可能就比較要花時間了,研究了一下後,找到MongoDB內有Aggregation Framework可以做到很多想用的操作,SQL to Aggregation Mapping Chart這篇文章中有很多範例了,基本上SQL中的WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, SUM, COUNT等操作,用aggregate都有方法代替,文章中已經有很多範例了,我再多寫幾個有用到的例子,這樣大部分別太複雜的查詢應該都足夠涵蓋了。
其他範例在MongoDB的官方文件範例上都差不多有,我就不重複了,至於要用Join的方式我還沒試過,而更複雜的查詢就要用MapReduce了。
SQL
Mongo
SELECT MAX(price) AS 'max',
AVG(price) AS 'avg',
MIN(price) AS 'min'
FROM dbo.orders
WHERE ord_date>='2013/10/1'
AND ord_date<'2013/11/1'db.orders.aggregate([
{$match: { ord_date:{
$gte:new Date('2013/10/1'),
$lt:new Date('2013/11/1')}}},
{$group: { _id:null,
max:{$max:'$price'},
avg:{$avg:'$price'},
min:{$min:'$price'}}}
])
SELECT TOP 20
cust_id,
status,
count(1) AS 'count'
FROM dbo.orders
WHERE ord_date>='2013/10/1'
AND ord_date<'2013/11/1'
GROUP BY cust_id, status
ORDER BY 'count' DESCdb.orders.aggregate([
{$match:{act:act,
ord_date:{$gte:new Date('2013/10/1'),
$lt:new Date('2013/11/1')}}},
{$group:{
_id:{cust_id:'$cust_id',
status:'$status'},
count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:20}
])
SELECT status AS '_id',
sum(price) AS 'total'
FROM dbo.orders
WHERE ord_date>='2013/10/1'
AND ord_date<'2013/11/1'
GROUP BY statusdb.orders.aggregate([
{$match: {
ord_date:{$gte:new Date('2013/10/1'),
$lt:new Date('2013/11/1')}}},
{$group: {_id: '$status',
total: {$sum: '$price'}}}
])
其他範例在MongoDB的官方文件範例上都差不多有,我就不重複了,至於要用Join的方式我還沒試過,而更複雜的查詢就要用MapReduce了。

No comments:
Post a Comment