python学习Python 开发python爬虫实战

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

2016-04-21  本文已影响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为要导入的数据。

上一篇下一篇

猜你喜欢

热点阅读