命令交互
连接MongoDB:
mongo 192.168.168.225:10000/logs
目前Mongo下的数据库有:
- logs,目前存放用户行为日志
- form,病历夹表单数据
- platform,商业平台的相关数据
MongoDB常用命令:
> db.auth('logs','password') #填写账号密码,用密码取代“password”
> show dbs #查看所有的db
> use logs #连接到一个指定的数据库logs
> show collections #查看所有的集合
> db.getCollection('logs').find({}) #查看logs集合下的所有数据
> db.getCollection('logs').find({"log.CUSTOM_DATA.userId": 500566}) #查看userid=500566的用户日志
![](http://con.xingshulin.com/download/attachments/10388374/1004200.gif?version=1&modificationDate=1447689633000&api=v2)
简单查询
查询一条记录
db.data.findOne();
查询一共有多少记录
db.data.find().count();
查询按照时间倒序前10条
db.data.find({'date':{$gte:new Date(2015,9,1)}}).sort({'date':-1}).limit(10);
distinct
db.runCommand({
'distinct'
:
'data'
,
'key'
:
'log.appName'
})
|
查询objectID
db.data.find({
"_id"
: ObjectId(
"55938c9cf26adcbd53f61afb"
) });
|
复杂查询
聚合查询
聚合查询类似于关系数据库中的group by,是将数据按照指定维度汇总。例如:
db.data.aggregate(
{$match: {
"date"
:{$gt:new
Date
(2015,6,29)}}},
{$
group
: {
"_id"
:
"$log.page"
,
"count"
:{$
sum
:1}}},
{$sort:{
"count"
:-1}},
{$limit:10}
)
|
管道
group by date()
db.data.aggregate(
{$match:{
'date'
:{$gt:new
Date
(2015,9,8)}}},
{$
group
:{
'_id'
:{
'year'
:{$
year
:
'$date'
},
'month'
:{$
month
:
'$date'
},
'day'
:{$dayOfMonth:
'$date'
}},
'count'
:{$
sum
:1}}},
{$sort:{
'_id'
:-1}},
{$limit:10}
);
|
group data()+distinct
db.data.aggregate({$match:{$
and
:[{
'date'
:{$gte:new
Date
(2015,9,8)}},{
'date'
:{$lt:new
Date
(2015,9,12)}}],
'log.page'
:
'MainTabActivity'
,
'log.env'
:
'release'
}},
{$
group
:{
'_id'
:{
'month'
:{$
month
:
'$date'
},
'day'
:{$dayOfMonth:
'$date'
},
'userId'
:
'$log.uid'
}}},
{$
group
:{
'_id'
:{
'month'
:
'$_id.month'
,
'day'
:
'$_id.day'
},
'userId'
:{$
sum
:1}}},
{$sort:{
'_id'
:-1}},
{$limit:10});
|
排除字段为空的情况
db.data.aggregate(
{$match:{
'date'
:{$gte:new
Date
(2015,9,7)},
'log.url'
:/http:\/\/
static
.xingshulin.com\/zhenliaoquan\/main.html\?groupUID=a09f864b-6fc7-4884-8f15-a8a1982c085c/,
'log.userId'
:{$exists:
true
}}},
{$
group
:{
'_id'
:{
'day'
:{$dayOfMonth:
'$date'
},
'userId'
:
'$log.userId'
}}},
{$
group
:{
'_id'
:
'$_id.day'
,
'userNum'
:{$
sum
:1},
'userList'
:{$push:
'$_id.userId'
}}},
{$sort:{
'_id'
:-1}}
};
|
Mongo查询指定userid的访问日志:
db.getCollection(
'data'
).find({
"date"
:{$gt:
new
Date(
2015
,
9
,
30
)},
"log.userId"
:
827020
).sort({
"date"
:-
1
})
|
查询指定群组ID,不含IOS系统,倒排序:
db.getCollection(
'data'
).find({
"date"
:{$gt:
new
Date(
2015
,
9
,
30
)},
"log.systemName"
:{$ne:
"IOS"
},
"log.url"
:/quan.xingshulin.com\/group\/a09f864b-6fc7-
4884
-8f15-a8a1982c085c/}
).sort({
"date"
:-
1
})
|
数据更新
db.collection.update( criteria, objNew, upsert, multi )
- criteria : update的查询条件,类似sql update查询内where后面的
- objNew : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert : 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
db.getCollection(
'custom_buddies'
).
update
({
'project_id'
:
'e243b5ff-683f-4ddb-844d-f2d2b86455f2'
} , { $
set
: {
'enterprise'
:
'杏树林诊疗圈运营'
} },
false
,
true
);
|
典型查询
诊疗圈加载时间查询
db.data.aggregate({$match:{$
and
:[{
'date'
:{$gte:new
Date
(2015,9,1)}},{
'date'
:{$lt:new
Date
(2015,11,3)}}],
'log.url'
:/.xingshulin.com/,
'log.startTimestamp'
:{$exists:
true
}}},
{$project:{
'date'
:1,
'stay_time'
:{
'$subtract'
:[
'$log.timestamp'
,
'$log.startTimestamp'
]}}},
{$
group
:{
'_id'
:{
'year'
:{$
year
:
'$date'
},
'month'
:{$
month
:
'$date'
},
'day'
:{$dayOfMonth:
'$date'
}},
'avg'
:{$
avg
:
'$stay_time'
},
'count'
:{$
sum
:1}}},
{$sort:{
'_id'
:-1}},
{$limit:10}
);
|
- count:从病历夹APP进入诊疗圈首页的次数
- avg:每日平均加载时间,单位毫秒
数据类型
data数据定义
s:操作时间的秒值。
m:操作时间的分钟值。
h:操作时间的小时值。
logType:值为‘appStart’,则为启动app。值为‘search’,则结果每半秒都会产生一个结果。
timestamp:为当前操作时间。
referer:上一个链接页面。
env: release为上线的情况。
常用链接
Python与MongoDB
Python链接MongoDB,一般是用pymongo包,简要教程见此。
需要注意的是:A Note On Unicode Strings中提到的问题,Python取出MongoDB的数据是字典格式,并且对字典的key和value都会编码为unicode,需要解码使用。
类似于:
for
(k,v)
in
records.items():
if
type
(k)
=
=
unicode
:
k
=
k.encode(
'utf8'
)
if
type
(v)
=
=
unicode
:
v
=
v.encode(
'utf8'
)
|
MongoDB的主键类型是bson.objectid.ObjectId,可以通过 str(record["_id"]) 来转为字符串