pymongo相关操作
-
导入库,建立连接
a. from pymongo import MongoClient
b. client = MongoClient(host,port) -
创建数据库 myDB (应该叫连接数据库,比较创建数据库更合适)
a. db = client['myDB'] 或者
b. db = client.myDB
c. 两者是一个意思,凭喜好选择。注意,第一个【】里面是字符串
d. 如果数据库myDB不存在,则重新创建一个,如果存在,则连接已存在的myDB数据库 -
建立集合myColletions(相当于sql中的表单)
a. myColl = db['myColletions'] 或者
b. myColl = db.myColletions
c. 两者是一个意思,凭喜好选择。注意,第一个【】里面是字符串
d. 如果集合myColletions不存在,则重新创建一个,如果存在,则连接已存在的myColletions集合 -
插入文档记录(也就是sql中表单的行记录)
a. 如果插入的集合不存在,则mongoDB自动给你创建一个。
b. myColl.insert_one(BinaryJson) 插入单条数据
i. BinaryJson 可以简单理解为 二进制版的json,
mongoDB自动将json转换我BinaryJson,如无特殊需要插入json即可
ii. 插入一条Json格式的文档,也就是表单行记录
iii. 如果插入的json格式文档中不包括 '_id'字段,则mongoDB,自动创建一个‘_id‘字段,
并生成一个ObjectId,作为_id字段值。
iv. 返回一个 insertOneResult对象,它包括inserted_id属性,
返回一个被插入对象的_id字段值。:
1) result = myColl.insert_one(json)
2) coll_id = result.inserted_id
c. myColl.inssert_many(jsonColletions)插入多条数据
i. 插入一个json文档集合,一般情况下是 列表,列表的每一个元素,必须是一个json格式数据对象
ii. 如果插入的json格式文档中不包括 '_id'字段,则mongoDB,自动创建一个‘_id‘字段,
并生成一个ObjectId,作为_id字段值
iii. 返回一个insertManyResult对象,它包括inserted_ids属性,
返回被插入对象的_id字段值的列表 -
查询文档记录(sql中的表单查询)
a. 查询所有数据
i. myColl.find() 查询集合中的所有文档记录(表中的行记录)
1) 返回一个查询结果的游标,可迭代对象,就像open(fileName)函数一样
a) result = myColl.find() f = open(fileName)
b) for value in result: for value in f:
c) print value print f
d) 输出每一条文档记录(行记录) 输出每一行内容
2) 相当于 sql中的:
a) select * from myCollb. 查询限定操作(也就是sql中的 where 语句) i. myColl.find({'name':'liming'}) 查询集合中 字段 name = liming的记录 1) 注意:括号内部是一个 字典,或者 json格式的数据(其实都一个卵样) 2) 字典 key = 集合内文档的字段,value = 字段的值 3) 相当于sql中: select * from myColl where name = 'liming' ii. 一些高级操作: 1) 比较操作: a) 小于比较: i) myColl.find({'age':{'$lt':30}} ii) 查询age字段值 小于30的所有文档记录 iii) 注意:括号内是一个 字典 iv) 字典 key = 文档字段,value 是一个字典,其中 key = 比较操作符, value =比较值 v) 相当于sql中: select * from myColl where age < 30 b) 其他比较操作符 $gt 大于 $gte 大于等于 $lt 小于 $lte 小于等于 $ne 不等于 2) 组合查询: a) 逻辑与 and i) myColl.find({'name':'liming','age':30}) ii) 查询 name = liming 和 age = 30 的所有文档记录 iii) 注意:括号内是一个字典,两个元素。用 逗号分隔开,key = 字段,value=字段值 iv) 相当于sql: select * from myColl where name = 'liming' and age = 30 b) 逻辑或 or i) myColl.find({'$or':[{'name':'liming'},{'age':30}]}) ii) 查询name = 'liming' 或 age = 30的所有文档记录 iii) 注意:括号内是一个字典,key = '$or' 逻辑或操作符,value = 一个列表 列表内是两个字典,key = 字段,value=字段值 iv) 相当于sql: select * from myColl where name = 'liming' or age = 30 3) 对查询结果进行排序: a) myColl.find().sort('name',pymongo.DESCENDING) i) 对查询结果按照字段 name进行排序,默认为升序,可以指定排序方向, DESCENDING是降序 ii) 相当于sql: select * from myColl order by name DESC b) myColl.find().sort([{'name':pymongo.DESEDING',{'age':pymongo.DESEDING'}]) i) 对查询结果排序,指定排序方向为 降序,默认为升序。 先按照name字段排序,在按照age字段排序 ii) 相当于sql: select * from myColl order by name DESC ,age DESC DESC关键字只适用于 DESC前面的字段,需要的话,可以对每个字段指定一次 DESC
-
更新数据:
a. 更新指定字段
i. myColl.update_one() 更新一条文档,只更新找到的第一条记录
1) 包含三个参数:
a) 过滤器(筛选器),筛选出符合条件的文档
b) 更新操作
c) 一些相关的更新参数设置2) myColl.update_one({'age':30},{'$set':{'name':'zhangsan'}},upsert=True) a) 更新查询出来的符合 age = 30的第一条文档记录, b) 使用$set操作符 更新字段name 为 ’zhangsan‘ c) upsert = True 表示如果需要更新的字段不存在, 则mongoDB自动创建该包含该字段的文档,并更新该字段 i) 默认为False,表示文档不存在时,不创建新的文档 d) 注意:第二个参数是一个字典 key = $set 更新操作符 value = 需要更新的字段,以及需要更新的值。。 3) 相当于: update myColl set name = 'zhangsan' where age = 30 ii. myColl.update_many() 批量更新一组文档,更新找到的所有记录 1) 使用方法与update_one()一样 2) update_many()更新找到的所有记录,update_one()只更新找到的第一条记录。
-
清空集合内容(sql中清空表单内容)
a. myColl.delete_one() 删除指定字段文档记录
i. 删除一条记录,值删除找到的第一条记录
ii. myColl.delete_one({'age':30})
1) 删除age = 30 的所找到的第一条记录
iii. 相当于:
delete from myColl
where age = 30b. myColl.delete_many() i. 删除找到的所有记录 ii. 使用方法与 delete_one()一样 1) 只是,delete_one()只删除找到的第一条文档记录 2) delete_many()删除找到的所有文档记录 c. myColl.delete_many({}) i. 一次性清空整个集合的所有文档记录 ii. 相当于: delete from myColl
-
删除集合(sql中删除表单)
a. myColl.drop()
删除一个集合,彻底的删除,而不是清空
b. 相当于:
i. drop table myColl -
数据聚合:
a. 数据的分组,以及统计:
i. 根据一个字段分组文件,并计算总数:
1) myColl.aggregate( [ {'$group' : {'_id' : '$age' , 'count':{'$sum':1} } } ]
对字段age的记录进行分组,并计算age字段相同值的总和
2) 括号里面是个列表
a) 元素是一个字典,key = '$group' 分组操作符
b) value = 一个字典,两个元素。
i) 第一个元素
One. key = '_id' ,这个是固定不变,mongoDB按照id来查找文档
Two. value = '$age' 需要分组的字段,必须以
ii) 第二个元素
One. key = 'count' 设立一个字段别名,来显示统计值
Two. value = '$age' 需要分组的字段,必须以 $ 开头
Three. value =一个字典:
First. key = '$sum' 聚合操作符:计算总和操作
Second. value = 1 表示计算查询到的所有值
3) 相当于:
select age as _id,count(*) as count
from myColl
group by ageii. 筛选并分组文档: 1) myColl.aggregate([{[{'$match':{'name':'lisi','age':30}},{'$group':{'_id':'$age','count':{'$sum':1}}}]) a) 查询name = 'lisi' and age = 30的文档记录 b) 并对 age字段进行分组,并计算age字段相同值的总和 c) $match 筛选操作符 值为需要筛选的内容 2) 相当于: select age as _id,count(*) as count from myColl group by age having name = 'list' and age = 30 b. 其聚合操作符:
image.png
- PyMongo上的索引
a. 索引可以对查询的高效执行起到支持。如果没有索引,MongoDB必须进行全表扫描,
即扫描集合中的每个文档,来选择符合查询条件的文档。如果一个适当的索引存在于一个查询中,
MongoDB可以使用索引限制必须检查文档的数量。
b. 创建索引
要创建一个升序的索引,指定pymongo.ASCENDING为索引类型()。
要创建一个降序的索引,指定pymongo.DESCENDING为索引类型()。
i. myColl.creater_index()
1) 为集合myColl创建一个索引
2) MongoDB会在创建文档的时候自动为_id字段创建索引。
3) 只会在索引不存在的时候创建一个索引
ii. 指定索引:
1) myColl.create_index([('name',pymongo.ASCENDING)]
2) 为集合中的 name字段创建 自增(升序)索引
iii. 该方法返回创建索引的名字
c. 创建复合索引:
i. myColl.create_index([('name',pymongo.ASCENDING),('age',pymongo.DECENDING)])
ii. 在字段 name 和 age 上 创建一个 复合索引
iii. 指定name索引为升序,age索引为降序
iv. 索引的名字为:name索引_age索引