美文网首页python学习Python 开发python爬虫实战
Python学习日记6|在python中操作MongoDB数据库

Python学习日记6|在python中操作MongoDB数据库

作者: 是蓝先生 | 来源:发表于2016-04-21 16:19 被阅读3491次

    今天是4.21号。

    最近特别烦,不知是不是因为没找到实习的缘故,加上论文还没有消息回复。感觉马上不是面临找不到工作的压力,就是可能毕不了业。看到周围人都开始实习,自己在这里瞎折腾说不担心是安慰自己装出来的。

    甚至开始怀疑自己到底能够做什么,到底准备做什么。问问自己,一点底都没有。技术技术做不了,产品产品做不了,想起去年这个时候也是在胡乱找实习,结果一事无成。

    算了吧,最低要求,先把毕业要求达到再说,否则其他一切都是免谈。可是那些杂志社敢不敢给我来个好消息,昂。


    首先了解一下mongoDB中存储数据时的一些概念


    mongodb一些基本概念.png mongodb中的数据类型.png

    对于数据库的操作无外乎对表(集合)的操作和对数据(文档)的操作。在python中进行下面的所有操作前,先必须有这几条语句:

    import pymongo
    
    #与mongodb服务器建立连接
    connection = pymongo.MongoClient('localhost', 27017)
    
    student=connection['student'] #新建一个名为student的数据库
    或直接连接已有数据库,类似db = connection['tongcheng'],再直接使用数据库的表content,infor=db['content']
    
    connection.drop_database('student') #将名为student的数据库删除掉
    
    #下面以student库以及库中的users集合(表)进行讲解:
    

    一. 建表、删除表;
    # 建立名为users的集合(表),同建立数据库形式一样
    users=student['users']
    # 删除users集合
    student.users.drop()

    二. 插入、删除、更新记录(文档);

    (1)对建好的集合中插入数据,用insert(),insert_one()函数
        users.insert_one({'nickname':'namei'}) #一般要在表前加上数据库的名称即
        student.users.insert_one({'nickname':'namei'})
    
    (2)删除集合中的文档,用remove()函数,删除后的文档无法恢复
        student.users.remove() 表示删除集合里的所有记录
        student.users.remove({'yy':5}) #表删除yy=5的记录
        
        id = student.users.find_one({'name':'user2'})['_id']
        student.users.remove(id) # 查找到name=user2的记录,并根据记录的 id 删除该记录
    
    (3)更新记录,用update()函数
        update(criteria, objNew, upsert, mult)
        criteria: 需要被更新的条件表达式
        objNew: 更新表达式
        upsert: 如目标记录不存在,是否插入新文档。
        multi: 是否更新多个文档。
    
        student.users.update({'gid':last_gid, 'time':l_date}, {'$set':{'gid':last_gid}, '$set':{'time':l_date}, '$addToSet':{'categories':category_data}}, upsert=True)
        #上式表示添加'categories'字段到gid=last_gid,time=l_date的这条记录中。
    

    三. 数据的查询,这也是数据库操作的重点

        基本上是用find()函数进行查询,其中大于、大于等于、小于、小于等于这些关系运算符经常要用到,
    分别用'$gt','$gte','$lt','$lte'表示。
    
    (1)查询显示符合条件的记录
        # 查询 age 小于 15 的
        for u in student.users.find({"age":{"$lt":15}}): print u
        # 查询 name 等于 user8 的
        for u in student.users.find({"name":"user8"}): print u
    
        # 获取查询的一个记录 (注意用find_one()而不是find())
        u2 = student.users.find_one({"name":"user9"}) # 查不到时返回 None
        print u2
    
    (2)查询符合条件的特定键 (fields)
        # select name, age from users 
        for u in student.users.find(fields = ['name', 'age']): print u
    
        # select name, age from users where age = 21
        for u in student.users.find({"age":21}, ["name", "age"]): print u
     *这里要注意,["name", "age"]中可以是一个,也可以是多个;同时["name", "age"]是放在条件{}外的。
    
    (3)多条件查询(Conditional Operators)    # like 的可使用正则表达式查询
    
        # select * from users where name = 'user3' and age > 12 and age < 15
        for u in db.users.find({'age': {'$gt': 12, '$lt': 15}, 'name': 'user3'}): print u
        # select * from users where name = 'user1' and age = 21
        for u in db.users.find({"age":21, "name":"user1"}): print u
    
    *记住,使用find()函数时,对应的条件都是以字典形式表示{'age':{'$gt':12},'xx':'xx'},
    有多个条件时,都放在一个{}内
    
    
    
    (4)IN
        # select * from users where age in (23, 26, 32)
        for u in db.users.find({"age":{"$in":(23, 26, 32)}}): print u 
        # select * from users where age not in (23, 26, 32)
        for u in db.users.find({"age":{"$nin":(23, 26, 32)}}): print u 
    
    (5)计数,用到count()函数
        # select count(*) from users  查询users表中所有的记录的个数   
        print(db.users.find().count()) 
    
        # select count(*) from users where age > 30 查询users表中age>30的记录的个数
        print(db.users.find({"age":{"$gt":30}}).count()) 
    
    
    (6)对记录进行排序,用sort()函数,形如find().sort('xx',1/-1),xx表示按xx的升序/降序排列,注意与后面的1/-1是用逗号(,)隔开
        pymongo.ASCENDING # 表按升序排列,也可以用 1 来代替
        pymongo.DESCENDING #表按降序排列, 也可以用 -1 来代替
        for u in db.users.find().sort([("age", pymongo.ASCENDING)]): print u  # select * from 集合名 order by 键1
        for u in db.users.find().sort([("age", pymongo.DESCENDING)]): print u # select * from 集合名 order by 键1 desc
        for u in db.users.find().sort([("键1", pymongo.ASCENDING), ("键2", pymongo.DESCENDING)]): print u # select * from 集合名 order by 键1 asc, 键2 desc
    
    (7)从第几行开始读取(SLICE),读取多少行(LIMIT)
        #从第2行开始读取,读取3行记录
        for u in db.users.find().skip(2).limit(3): print u 
    .
    .
    

    四. 多级路径的元素值查询

    由于mongodb不支持表连接,所以文档中采取 JSON 这种层级结构存储多层数据,我们可以直接用嵌入(Embed)代替传统关系型数据库的关联引用(Reference)。

    MongoDB 支持以 "." 分割的 namespace 路径,但条件表达式中的多级路径须用引号包括起来

    (1)# 条件表达式中的多级路径须用引号,以 "." 分割
        u = db.集合名.find_one({"im.qq":12345678})
        # 查询结果如:{"_id" : ObjectId("4c479885089df9b53474170a"), "name" : "user1", "im" : {"msn" : "user1@hotmail.com", "qq" : 12345678}}
    
        print u['im']['msn']   #表打印出: user1@hotmail.com
    
    (2)# 多级路径的更新
        db.集合名.update({"im.qq":12345678}, {'$set':{"im.qq":12345}})
    
    (3)for u in db.users.find({'data':"abc"}): print u
      # 显示如: { "_id" : ObjectId("4c47a481b48cde79c6780df5"), "name" : "user8", "data" : [ { "a" : 1, "b" : 10 }, 3, "abc" ] }
    

    五、mongodb中数据类型转换

    对于一条记录x,若其字段'price'为string型,则可以如下转换为int型。
         x['price']=int(x['price'])
    
    $type: 用于判断属性类型。
        for u in db.users.find({'t':{'$type':1}}): print u # 查询数字类型的
        for u in db.users.find({'t':{'$type':2}}): print u # 查询字符串类型的
      各种类型值的代表值:
        double:1
        string: 2
        object: 3
        array: 4
        binary data: 5
        object id: 7
        boolean: 8
        date: 9
        null: 10
    

    六、导入json格式数据到Mongodb中
    (1)首先打开cmd,然后运行cd c:\mongodb(\server\3.2)\ bin,即cd到bin目录下,不同的电脑中路径可能不同。
    (2)输入命令:mongoimport --db ceshi --collection tongcheng --drop --file f:\xx.json
    其中ceshi表示你将要在Mongo中新建的数据库,tongcheng表示在ceshi数据库下新建一个集合(即表),xx.json为要导入的数据。

    相关文章

      网友评论

      本文标题:Python学习日记6|在python中操作MongoDB数据库

      本文链接:https://www.haomeiwen.com/subject/bugzlttx.html