我将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
新手。
提前致谢。
答案 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
,以便继续进行下一个要评估的条件,否则返回与您的条件匹配的值。
通过这种方式,您可以在汇总预期总数时应用“已知”值。