Python学习日记6|在python中操作MongoDB数据库
今天是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为要导入的数据。