MongoDB汇总了另一个泛滥建议

时间:2014-06-16 10:26:51

标签: mongodb aggregation-framework

我将Json文件导入MongoDB。它上面的每一行都是一个用户,我有一个字段产品,名称是它。我知道每件产品的价值,他们只是少数。 但此信息未存储在Json

我能够进行聚合以检索用户购买产品的时间,但我想进行查询以直接获得每个用户花费的金额。

这是我的疑问:

db.source.aggregate([
    {"$match": {
       "$and":[
           {"productName":{
               "$in":[
                    "product2","product2","product3",
                    "product4","product5","product6"
                   ]
           }}, 
           { "$or": [
               {"appID" : "nameOfAPP"},
               {"appID": "NameOfAPP2"}
           ]}
        ]
    }},
    { "$group": {
        "_id": {
            "id_user": "$id_user", 
            "productName": "$productName"
        }, 
        "count": { "$sum": 1}
    }},
    { "$sort" : { "count": -1 } }
])

所以输出就是这样:

{ "_id" : { "id_user" : "user1", "productID" : "product2" }, "count" : 433 }
{ "_id" : { "id_user" : "user2", "productID" : "product1" }, "count" : 370 }
{ "_id" : { "id_user" : "user1", "productID" : "product3" }, "count" : 300 }
{ "_id" : { "id_user" : "user3", "productID" : "product6" }, "count" : 250 }
{ "_id" : { "id_user" : "user2", "productID" : "product5" }, "count" : 140 }
{ "_id" : { "id_user" : "user3", "productID" : "product4" }, "count" : 90 }

我知道产品1成本20美元,产品2成本40美元,产品3成本55美元,产品4成本-90美元,产品5成本110美元,产品6成本200美元。

我希望有这样的输出:

{ "_id" : { "id_user" : "user1"}, "money_spent" : 600$ }
{ "_id" : { "id_user" : "user2"}, "money_spent" : 400$ }
etc

你能帮助我获得这个结果,我是MongoDB新手。

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您无法转到原始源数据,则仅使用导入,请执行以下操作:

db.source.aggregate([
    {"$match": {
       "$and":[
           { "productName": {
               "$in":[
                    "product1","product2","product3",
                    "product4","product5","product6"
                   ]
           }}, 
           { "$or": [
               {"appID" : "nameOfAPP"},
               {"appID": "NameOfAPP2"}
           ]}
        ]
    }},
    { "$group": {
       "_id": "$id_user",
       "cost": {
           "$sum": {
               "$cond": [
                   { "$eq": ["$_id.productId", "product1"] },
                   20,
                   { "$cond": [
                       { "$eq": ["$productName", "product2"] },
                       40,
                       { "$cond": [
                           { "$eq": [ "$productName", "product3"] },
                           55,
                           { "$cond": [
                               { "$eq": [ "$productName", "product4" ] },
                               -90,
                               { "$cond": [ 
                                   { "$eq": [ "$productName", "product5" ] },
                                   110,
                                   200
                               ]}
                           ]}
                       ]}             
                   ]}
               }
           }
       }
    }}
])

$cond运算符会评估您的字段值是否与条件匹配,并仅根据$sum放置适当的值以获得结果。

$cond提供“三元”运算符或“if .. then .. else”,用于评估您在第一个参数中提供的条件。您将其构造为“cascade”,其中条件的计算结果为false,以便继续进行下一个要评估的条件,否则返回与您的条件匹配的值。

通过这种方式,您可以在汇总预期总数时应用“已知”值。