簡體   English   中英

具有條件的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邏輯,但是在分組后字段typetransaction_time不存在,因此我在分組之前移動它們,並且它工作。 在線MongoDB Shell上測試。

如果您在聚合方面遇到問題,因為它是一組正在創建管道的操作,最好自己測試每個操作,只需檢查$group操作結果就足以解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM