pymongo相关操作

  1. 导入库,建立连接
    a. from pymongo import MongoClient
    b. client = MongoClient(host,port)

  2. 创建数据库 myDB (应该叫连接数据库,比较创建数据库更合适)
    a. db = client['myDB'] 或者
    b. db = client.myDB
    c. 两者是一个意思,凭喜好选择。注意,第一个【】里面是字符串
    d. 如果数据库myDB不存在,则重新创建一个,如果存在,则连接已存在的myDB数据库

  3. 建立集合myColletions(相当于sql中的表单)
    a. myColl = db['myColletions'] 或者
    b. myColl = db.myColletions
    c. 两者是一个意思,凭喜好选择。注意,第一个【】里面是字符串
    d. 如果集合myColletions不存在,则重新创建一个,如果存在,则连接已存在的myColletions集合

  4. 插入文档记录(也就是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字段值的列表

  5. 查询文档记录(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 myColl

    b. 查询限定操作(也就是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
    
  6. 更新数据:
    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()只更新找到的第一条记录。
    
  7. 清空集合内容(sql中清空表单内容)
    a. myColl.delete_one() 删除指定字段文档记录
    i. 删除一条记录,值删除找到的第一条记录
    ii. myColl.delete_one({'age':30})
    1) 删除age = 30 的所找到的第一条记录
    iii. 相当于:
    delete from myColl
    where age = 30

      b. myColl.delete_many()
         i. 删除找到的所有记录
         ii. 使用方法与 delete_one()一样
             1) 只是,delete_one()只删除找到的第一条文档记录
             2) delete_many()删除找到的所有文档记录
    
     c. myColl.delete_many({}) 
         i. 一次性清空整个集合的所有文档记录
         ii. 相当于:
             delete from myColl
    
  8. 删除集合(sql中删除表单)
    a. myColl.drop()
    删除一个集合,彻底的删除,而不是清空
    b. 相当于:
    i. drop table myColl

  9. 数据聚合:
    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 age

         ii. 筛选并分组文档:
             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
  1. 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索引
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,537评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 梦中的温柔即是梦魇 一种梦醒时破碎的痛 在她的怀里 我的眼角旁 流过的 那是现实 与永远无法得到的虚妄
    写废纸的熊阅读 216评论 10 5
  • 文/陌忘芊 我已经很少看电视了,可昨天晚上十点,我特意打开了电视,等着《我是歌手》听张信哲的那首歌。 前奏响起的那...
    陌忘芊阅读 11,049评论 143 378