![](/img/trans.png)
[英]aggregation with group by, inner join and nested conditions in MongoDB
[英]MongoDB group aggregation with conditions
我有以下樣本集:
{
"_id" : ObjectId("59007c230c16863f9ae8ea00"),
"user_id" : 1,
"transaction_time" : ISODate("2017-04-26T10:52:33.000Z"),
"type" : "data_plan",
"amount" : 540.0,
"updated_at" : ISODate("2017-04-26T10:53:23.389Z"),
"created_at" : ISODate("2017-04-26T10:53:23.389Z")
}
這相當於我想在SQL中做的事情:
SELECT user_id, SUM(amount) as total_amount
FROM user_transactions
WHERE type = 'data_plan'
AND transaction_time BETWEEN '2017-04-14' AND '2017-04-20'
GROUP BY user_id
HAVING total_amount >= 2000
這是我當前執行相同操作的查詢;
db.user_transactions.aggregate([{
'$group': {
'_id': {
'user_id': '$user_id'
},
'amount': {
'$sum': '$amount'
},
'user_id': {
'$first': '$user_id'
}
}
},
{
'$match': {
'amount': {
'$gte': 2000
}
'type': {
'$eq': 'data_plan'
},
'transaction_time': {
$gte: ISODate("2017-04-14T00:00:00.000Z"),
$lt: ISODate("2017-04-20T00:00:00.000Z")
}
}
}
])
它沒有返回任何結果,但是當我刪除transaction_time
並從$match
type
它時。
我想我明白了;
db.user_transactions.aggregate([{
$match: {
type: {
$eq: "data_plan"
},
transaction_time: {
$gte: ISODate("2017-04-14T00:00:00.000Z"),
$lt: ISODate("2017-04-20T00:00:00.000Z")
}
}
}, {
$group: {
_id: "$user_id",
amount: {
$sum: "$amount"
},
user_id: {
$first: "$user_id"
}
}
}, {
$match: {
amount: {
$gte: 2000
}
}
}])
您的查詢的問題是,您試圖在$group
階段結束時一次性執行$match
邏輯,但是在分組后字段type
和transaction_time
不存在,因此我在分組之前移動它們,並且它工作。 在線MongoDB Shell上測試。
如果您在聚合方面遇到問題,因為它是一組正在創建管道的操作,最好自己測試每個操作,只需檢查$group
操作結果就足以解決您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.