概念

MongoDB非常强大且容易上手。 - 文档(document)是MongoDB中数据的基本单元,非常类似于关系数据库的行,但更有表现力。 - 集合(collection)可以看做是一个拥有动态模式的表。 - MongoDB的一个实例可以拥有多个相互独立的数据库,每个数据库都拥有自己的集合。

因为文档和集合是动态的,所以这两个都具有很强的表现力。

文档

文档是MongoDB的核心概念。文档就是一个键值对。python中的字典,javascript中的对象。这种键值对可简单也可很复杂。 MongoDB对是字符串,有两条简单的约束: - 键不能含有\0(空字符)。这个字符用于表示键的结尾。 - .$具有特殊意义,通常这两个是保留字符,所以建议不要用在中。

集合

集合就是一组文档。如果将MongoDB中的一个文档比喻为关系数据库中的一行,那个一个集合就相当于一张表。 MongoDB中的集合是可以动态构建的。即在插入数据时,如果没有某个集合,则自动创建。

客户端

日常分析数据时,需要便捷的客户端,这里强烈推荐Robomongo,真的是超级方便啊。

查询

先查看这里http://docs.mongoing.com/manual/reference/sql-comparison.html#select,以后再总结。 排除不包含status键的documentdb.collection.find({'status': {$ne: null}})

索引

数据量大的时候,可以建立索引以便加快查询的速度。 查看索引 db.collection.getIndexes() db.collection.ensureIndex({status:1 }) 1代表索引的方向,为正向。

管理

参考 > mongodb 备份 还原 导出 导入

mongodb 用户 权限 设置 详解

数据操作(pandas)

把mongo和python连接起来就是分析数据的利器了,而这个工具就是pandas。 首先要把需要分析数据导入到pandas中参考How to import data from mongodb to pandas?。 那么pandas中最重要的就是DataFrame了,一般简写为df。 接下来最重要的就是操作df,首先是要取数据,开始常用的是按位置取值iloc

取值是pandas的强悍功能。

操作符 含义
obj.ix[:, val]
obj.loc[:val]
obj.iloc[:val]
obj.icol(val)
obj[val] 从Series选择单个值/多个值可以切片,可以是单个值
从DataFrame选择单一列/多列
obj[val] val是 字符的列标签
obj[布尔数据] Series: 过滤 值
DataFrame: 过滤行
obj[col]
obj[[col1, col2]]
选择列
选择多列
obj[1:3]
obj['b':'d']
Series: 切片
DataFrame: 行切片(取1-3行,0坐标)
obj.ix[val]
obj.loc[val]
obj.iloc[val]
obj.irow(val)
从DataFrame的行集选择单行/多行
obj.ix[val1, val2] 选择DataFrame行和列
obj.loc[] df.loc[row_indexer,column_indexer] str标签
obj.iloc[] df.loc[row_int,column_int] int标签


下标选取数据

df['one']
df.one

以上两个语句是等效的,都是返回df名称为one列的数据,返回的为一个Series。

df[0:3]

另外df[0]已经不支持,不要使用,请使用df.iloc[0]。 下标索引选取的是DataFrame的记录(行),与List相同DataFrame的下标也是从0开始,区间索引的话,为一个左闭右开的区间,即[0:3]选取的为1-3三条记录。 与此等价,还可以用起始的索引名称和结束索引名称选取数据:

df['a':'b']

有一点需要注意的是使用起始索引名称和结束索引名称时,也会包含结束索引的数据。以上两种方式返回的都是DataFrame。

标签选取数据

df.loc[行标签,列标签]
df.loc['a':'b']     #选取ab两行数据
df.loc[:,'one']     #选取one列的数据

df.loc的第一个参数是行标签,第二个参数为列标签(可选参数,默认为所有列标签),两个参数既可以是列表也可以是单个字符,如果两个参数都为列表则返回的是DataFrame,否则,则为Series。

位置选取数据

df.iloc[行位置,列位置]
df.iloc[1,1]         #选取第二行,第二列的值,返回的为单个值
df.iloc[0,2],:]      #选取第一行及第三行的数据
df.iloc[0:2,:]       #选取第一行到第三行(不包含)的数据
df.iloc[:,1]         #选取所有记录的第一列的值,返回的为一个Series
df.iloc[1,:]         #选取第一行数据,返回的为一个Series
df.iloc[-1,:]        #选取最后一行数据,返回的为一个Series, 支持 -1

PS:loc为location的缩写,iloc则为integer & location的缩写

更广义的切片方式是使用.ix,它自动根据你给到的索引类型判断是使用位置还是标签进行切片

df.ix[1,1]
df.ix['a':'b']

标量取值

df.at['a', 'one']
df.iat[0, 2]

.at.iat只能取标量,即只能取单个值 这与.loc.iloc不同,.loc.iloc能使用x:y取一个范围,也能取标量。 那为什么要有.at.iat,因为取单个值的时候,.at.iat的速度是很快的。

逻辑array选取数据

df[逻辑条件]
df[df.one >= 2]                     #单个逻辑条件
df[(df.one >=1 ) & (df.one < 3) ]   #多个逻辑条件组合
df[(df.username == '') & map(lambda x: x['user_id']=='', df.context)]
或
c = [True, False, True]
df[c]
df.iloc[:, c]
df.loc[:, c]
df.loc[c, :]

说明: > | 代表 or, & 代表 and, and ~ 代表 not > 这种方式获得的数据切片都是DataFrame。 > pandas中的Boolean indexing必须是包含TrueFaslelist。包含01得不到想要的值,不能是迭代器,必须是list。 > 下标bool取值只能过滤记录(行),所以既要过滤行又要过滤列,直接使用标签或位置bool取值 > iloc、loc等等也都可以使用Boolean indexing,如c = [True, Fasle]; df.iloc[:, c]

参考链接