文章目录
  1. 1. Q1:查看饿了么的花费
  2. 2. Q2: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命令才能执行。输入该命令Ok

1
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 顺便看看饿了么上花了多少钱
db.alipay.aggregate([{
$match: {
交易对方: "饿了么"
}
}, {
$group: {
_id: null,
total: {
$sum: '$金额( 元)'
}
}
}])
{ "_id" : null, "total" : 0 }
# 上面结果显示为0 大大出乎意料 仔细查找原因发现条件写错了(真是无比尴尬还让我找了好久原因)

结果怎么是0,明显又错了
查找了N久在官方文档上查到了相关信息
原因只有两种
1.全部都非数字返回0
2.该字段不存在返回0
我这次就是原因,找了N久发现可以按照该字段排序,而且该字段全部有值,但是返回的却是0
最后发现字段名错误

Q2:mongodb如何按照某字段做增量导入

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
# 创建交易号的index,设置该列唯一
db.alipay.createIndex({
交易号: 1
}, {
unique: true
})
```
只需要给某字段添加索引并设置唯一即可
再次导入相同交易号时就无法导入


### Q3:MongoDB某列类型修改(原类型为String修改后为Date)
根据付款时间段进行统计的时候发现没结果,仔细查看发现这个字段是字符串需要把字符串转成日期
``` bash
# 查看该字段为字符串的个数
# 至于$type 详见这里https://docs.mongodb.com/manual/reference/operator/query/type/index.html
# 根据数量判断表里该列数据全部都是字符串格式
db.alipay.find({
'付款时间': {
$type: 2
}
}).count();
96
mkp
# 修改该列数据类型
db.alipay.find({
"付款时间": {
$type: 2
}
}).forEach(
function (x) {
x.付款时间 = new Date(x.付款时间);
db.alipay.save(x);
}
);
# 再次查看该列数据类型为字符串的数据发现结果已经是0了
db.alipay.find({'付款时间': {$type: 2}}).count();
0

最后才发现一年的数据量其实也没多少 直接用excel的筛选求和更好 真不应该因为手里有🔨就把所有问题都看成钉子

文章目录
  1. 1. Q1:查看饿了么的花费
  2. 2. Q2:mongodb如何按照某字段做增量导入