使用mongodb统计支付宝个人消费信息
把支付宝导出记录导入mongodb,然后通过数据库查数据
1.支付宝excel导入mongodb
搜索相关文档后得出mongodb可以导入csv格式的文件使用mongoimport
这边有个插曲:
在zsh中运行mongo命令时报错说zsh: command not found: mongo
于是找到我的mongo安装目录mongodb-osx-x86_64-3.4.0/bin
傻傻的像windows一样直接运行mongo结果依然报错zsh: command not found: mongo
这不科学啊
找到原来记录说要用./mongo
命令才能执行。输入该命令Ok1
2
3# pwd查看当前目录
➜ bin pwd
/mongodb-osx-x86_64-3.4.0/bin
mongo命令不能全局使用这怎么可以。。开搞让这个命令全局可用
其实也简单只需要把mongodb-osx-x86_64-3.4.0/bin
目录放到PATH即可
1.打开 应用程序 -> 实用工具 -> 终端;
2.在终端中定位到自己用户的主目录,输入: cd ~;
3.创建一个空文件,输入:touch .bash_profile ;
4.编辑这个文件,输入:open .bash_profile ;
5.在这个文件中输入:export PATH=${PATH}:<文件目录>;(将”<文件目录>”替换成自己想要的目录)
例如:export PATH=${PATH}:mongodb-osx-x86_64-2.6.1/bin(我把下载后的文件直接放到了根目录);
6.如果需要添加其他的环境变量例如JAVA_HOME,可以输入:export JAVA_HOME=/Library/Java/Home ;
7.source .bash_profile重启终端,测试,这个时候就可以在用户主目录使用上面配置过的配置文件进行设置mongod –config /mongodb/etc/mongod.conf 来启动数据库了,点击终端Commond+N打开一个新的终端,使用mongo命令来连接数据库,对数据库进行操作,比如:show dbs 显示所有的集合
因为之前已经设置过了,不知道什么原因导致PATH重置,只需添加PATH并使用命令source .bash_profile
重启终端即可
继续mongoimport命令mongoimport --db test --collection alipay --file /Users/zyx/Downloads/alipay_record_20170925_1718_1.csv --type csv --headerline --mode upsert
1
2
3➜ ~ mongoimport --db test --collection alipay --file /Users/zyx/Downloads/alipay_record_20170925_1718_1.csv --type csv --headerline --mode upsert
2017-09-26T09:16:52.786+0800 connected to: localhost
2017-09-26T09:16:52.868+0800 imported 107 documents
成功导入107条记录1
2
3
4
5> db.alipay.find().limit(1).pretty()
{
"_id" : ObjectId("59c9aa8436b7bea4ae668f47"),
"֧��������¼��ϸ��ѯ" : "�˺�:[zhuyangxing@sohu.com]"
}
又出现两个错误
1.乱码
2.字段也不对啊
先删掉再重新导入1
2> db.alipay.remove({})
WriteResult({ "nRemoved" : 107 })
务必删掉上面和下面的统计信息后导入1
2
3➜ ~ mongoimport --db test --collection alipay --file /Users/zyx/Downloads/alipay_record_20170925_1718_2.csv --type csv --headerline --mode upsert
2017-09-26T09:26:56.260+0800 connected to: localhost
2017-09-26T09:26:56.284+0800 imported 96 documents
再次进入mongo查看1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20> db.alipay.find().limit(1).pretty()
{
"_id" : ObjectId("59c9ace036b7bea4ae669038"),
"����" : "2017092421001004100535306063\t",
"�̻�������" : "02170924212541911944732481548288\t",
"���״���ʱ��" : "2017/9/24 21:25",
"����ʱ��" : "2017/9/24 21:25",
"������ʱ��" : "2017/9/24 21:25",
"������Դ��" : "���������������Ͱͺ��ⲿ�̼ң�",
"����" : "��ʱ���˽���",
"���Է�" : "�Ϻ�����������ס������Ӫ�����ɷ�����˾",
"��Ʒ����" : "���ͱ�����",
"���Ԫ��" : 3915.34,
"��/֧" : "֧��",
"����״̬" : "���׳ɹ�",
"�����ѣ�Ԫ��" : 0,
"�ɹ��˿Ԫ��" : 0,
"��ע" : "",
"�ʽ�״̬" : "��֧��"
}
2.发现字段对了但是乱码问题依旧存在
使用其他文本编辑器(nodepad++,editplus,atom等)选择字符集为GB312打开才正常显示,使用utf-8重新保存该csv文件并再次导入即可1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172> db.alipay.find().limit(1).pretty()
{
"_id" : ObjectId("59c9b1d536b7bea4ae6691f0"),
"交易号" : "2017092421001004100535306063\t",
"商户订单号" : "02170924212541911944732481548288\t",
"交易创建时间" : "2017/9/24 21:25",
"付款时间" : "2017/9/24 21:25",
"最近修改时间" : "2017/9/24 21:25",
"交易来源地" : "其他(包括阿里巴巴和外部商家)",
"类型" : "即时到账交易",
"交易对方" : "上海青客公共租赁住房租赁经营管理股份有限公司",
"商品名称" : "青客宝付款",
"金额(元)" : 315.34,
"收/支" : "支出",
"交易状态" : "交易成功",
"服务费(元)" : 0,
"成功退款(元)" : 0,
"备注" : "",
"资金状态" : "已支出"
}
# 创建交易号的index,设置该列唯一 确保以后不会导入重复数据
db.alipay.createIndex({
交易号: 1
}, {
unique: true
})
#查看都有那些交易方
db.alipay.distinct("交易对方");
[
"上海青客公共租赁住房租赁经营管理股份有限公司",
"沃尔玛大卖场(上海杨行分店)",
"招商银行",
"源顺家居专营店",
"艺舟树下专卖店",
"中联生活",
"金牌外婆家(上海IAPM店)",
"饿了么",
"newbalance旗舰店",
"美团/大众点评",
"苏州冶金图书专营店",
"天弘基金管理有限公司",
"上海宝山宜家家居有限公司",
"苏北蛋饼",
"麦当劳(淮海中路APM餐厅)",
"可的(黄兴二)",
"深圳市丰巢科技有限公司",
"开宗车品专营店",
"艾魅嘉数码专营店",
"辰辉家居专营店",
"惠乐美生鲜超市",
"上海市金山区魏达食品店",
"农夫山泉股份有限公司",
]
# 查看id与金额
db.alipay.find({}, {
'金额(元)': 1
}).pretty()
# 查看金额最低的5条记录
db.alipay.find().limit(5).sort({
'金额(元)': 1
}).pretty()
# 查看金额最高的5条记录
db.alipay.find().limit(5).sort({
'金额(元)': -1
}).pretty()
# 查查看在饿了么上买了几次
db.alipay.count({"交易对方":"饿了么"});
5
# 顺便看看饿了么上花了多少钱
db.alipay.aggregate([{
$match: {
交易对方: "饿了么"
}
}, {
$group: {
_id: null,
total: {
$sum: '$金额( 元)'
}
}
}])
{ "_id" : null, "total" : 0 }
# 上面结果显示为0 大大出乎意料 仔细查找原因发现条件写错了(真是无比尴尬还让我找了好久原因)
# 详见Q1
db.alipay.aggregate([{
$match: {
交易对方: "饿了么"
}
}, {
$group: {
_id: null,
total: {
$sum: "$金额(元)"
}
}
}])
{ "_id" : null, "total" : 131.7 }
# 可以按交易方和金额归类总结
db.alipay.aggregate([{
$group: {
_id: '$交易对方',
total: {
$sum: '$金额(元)'
}
}
}])
# 显示所有商品名称用逗号分开
# 与sum类似的也有很多 详见 https://docs.mongodb.com/manual/reference/operator/aggregation-group/
db.alipay.aggregate([{
$group: {
_id: '$交易对方',
total: {
$sum: '$金额(元)'
},
name: {
$addToSet: '$商品名称'
}
}
}, {
$sort: {
total: -1
}
}], {
allowDiskUse: true
})
# 只显示第一个商品名称
db.alipay.aggregate([{
$group: {
_id: '$交易对方',
total: {
$sum: '$金额(元)'
},
name: {
$first: '$商品名称'
}
}
}, {
$sort: {
total: -1
}
}], {
allowDiskUse: true
})
# 根据时间段统计
db.alipay.aggregate([{
$match: {
付款时间: {
$gt: new Date(2017, 9, 10),
$lt: new Date(2017, 9, 20)
}
}
}, {
$group: {
_id: '$交易对方',
total: {
$sum: '$金额(元)'
},
name: {
$first: '$商品名称'
}
}
}, {
$sort: {
total: -1
}
}], {
allowDiskUse: true
})
查看下最近一年经过支付宝的消费情况
先导入数据mongoimport --db test --collection alipay --file /Users/zyx/Downloads/alipay_record_20170927_1409_2.csv --type csv --headerline --mode upsert
Q1:查看饿了么的花费
1 | # 顺便看看饿了么上花了多少钱 |
结果怎么是0,明显又错了
查找了N久在官方文档上查到了相关信息
原因只有两种
1.全部都非数字返回0
2.该字段不存在返回0
我这次就是原因,找了N久发现可以按照该字段排序,而且该字段全部有值,但是返回的却是0
最后发现字段名错误
Q2:mongodb如何按照某字段做增量导入
1 | # 创建交易号的index,设置该列唯一 |
最后才发现一年的数据量其实也没多少 直接用excel的筛选求和更好 真不应该因为手里有🔨就把所有问题都看成钉子