左手MongoDB(快速入门)
一、SQL与MongoDB术语对比
SQL | MongoDB |
---|---|
表(Table) | 集合(Collection) |
行(Row) | 文档(Document) |
列(Col) | 字段(Field) |
主键(Primary Key) | 对象ID(ObjectId) |
索引(Index) | 索引(Index) |
嵌套表(Embeded Table) | 嵌入式文档(Embeded Document) |
数组(Array) | 数组(Array) |
二、插入单条数据
插入单条数据的命令为
insertOne()
db.getCollection('example_data_1').insertOne({"name":"张小二","age":17,"address":"浙江"})

刚刚插入的数据

三、批量插入数据
批量插入数据的命令为
insertMany()
db.getCollection('example_data_1').insertMany([
{"name":"张小三","age":17,"address":"浙江"},
{"name":"张小四","age":16,"address":"上海"},
{"name":"张小五","age":14,"address":"山东"},
{"name":"张小六","age":15,"address":"广东"},
{"name":"张小七","age":12,"address":"广西"},
{"name":"张小八","age":11,"address":"河南"},
{"name":"张小九","age":13,"address":"河北"},
])

刚刚插入的数据

四、查询固定值数据
1、查询所有数据
db.getCollection('example_data_1').find({})
或
db.getCollection('example_data_1').find()

2、查询特定数据
db.getCollection('example_data_1').find({'字段1':'值1','字段2':'值2'})
查询所有“age”字段为17的记录
db.getCollection('example_data_1').find({'age':17})

db.getCollection('example_data_1').find({'age':17,'name':'张小三'})

3、查询范围值数据
范围操作符及其意义
操作符 | 意义 | |
---|---|---|
$gt | 大于(Great Than) | |
$gte | 大于等于(Great Than and Equal) | |
$lt | 小于(Less Than) | |
$lte | 小于等于(Less Than and Equal) | |
$ne | 不等于(Not Equal) |
查询所有“age”字段不小于15的记录
db.getCollection('example_data_1').find({'age':{'$gte':15}})

使用范围操作符的查询语句格式如下
db.getCollection('example_data_1').find({'age':{'操作符1':边界1,'操作符2':边界2}})
查询所有“age”大于14并小于17的数据
db.getCollection('example_data_1').find({'age':{'$lt':17,'$gt':14}})

查询所有“age”大于14并小于17的数据,且“name”不为“张小六”的数据
db.getCollection('example_data_1').find({'age':{'$lt':17,'$gt':14},'name':{'$ne':'张小六'}})

4、限定返回那些字段
“find”命令可以接收两个参数:第一个参数用于过滤不同的记录,第二个参数用于修改返回的字段。如果省略第二个参数,则MongoDB会返回所有的字段。
db.getCollection('example_data_1').find(用于过滤记录的字典,用于限定字段的字典)
用于限定字段的字典的Key为各个字段名。其值只有两个0或者1
查询数据集数据,但不返回“name”和“age”字段
db.getCollection('example_data_1').find({},{'age':0,'name':0})

查询数据集数据,只返回“name”和“age”字段
db.getCollection('example_data_1').find({},{'age':1,'name':1})

默认返回“_id”字段
db.getCollection('example_data_1').find({},{'_id':0,'age':1,'name':1})

5、修饰返回结果
(1)满足要求的数据有多少条,count()命令
查询所有“age”大于15的记录有多少条
db.getCollection('example_data_1').find({'age':{'$gt':15}}).count()

(2)限定返回结果集条数,limit()命令
限制只返回5条
db.getCollection('example_data_1').find({}).limit(5)

(3)对查询结果进行排序,sort()命令
字段的值为-1表示倒序,为1表示正序
db.getCollection('example_data_1').find({'age':{'$gt':15}}).sort({'字段名':-1或1})
对所有“age”大于15的数据,按“age”排序
db.getCollection('example_data_1').find({'age':{'$gt':15}}).sort({'age':1})

五、修改数据
updateOne():更新第一条满足要求的数据
updateMany():更新所有满足要求的数据
db.getCollection('example_data_1').updateMany(参数1:查询语句的第一个字典,{'$set':{'字段1':'新的值1','字段2':'新的值2'}})
修改“name”为“张小四”的文档,添加“work”字段,把“age”从16改成22
db.getCollection('example_data_1').updateMany({'name':'张小四'},{'$set':{'work':'新时代农民','age':22}})


六、删除数据
deleteOne():删除第一条满足要求的数据
deleteMany():删除所有满足要求的数据
删除“work”字段为“新时代农民”的所有记录
db.getCollection('example_data_1').deleteMany({'work':'新时代农民'})


七、数据去重
去重操作的命令为“distinct()”
db.getCollection('example_data_1').distinct('字段名',查询语句的第一个字典(可以省略))
(1)对“age”字段去重
db.getCollection('example_data_1').distinct('age')

(2)对满足特定条件的数据去重
查询“age”大于等于15的数据,并对“age”去重
db.getCollection('example_data_1').distinct('age',{'age':{'$gte':15}})

“distinct()”不能实现去重之后带上其他字段
八、使用Python操作MongoDB
(1)安装PyMongo
pip install pymongo
(2)连接数据库
from pymongo import MongoClient
# client = MongoClient('mongodb://用户名:密码@IP地址:端口号')
client = MongoClient('mongodb://127.0.0.1:27017')
database = client.chapter_3
collection = database.example_data_1
# 另一种方式
# database = client['chapter_3']
# collection = database['example_data_1']
MongoDB命令与PyMongo方法对照表
MongoDB命令 | PyMongo方法 |
---|---|
insertOne | insert_one |
insertMany | insert_many |
find | find |
updateOne | update_one |
updateMany | update_many |
deleteOne | delete_one |
deleteMany | delete_many |
使用Python批量插入数据
from pymongo import MongoClient
client = MongoClient('mongodb://127.0.0.1:27017')
database = client.chapter_3
collection = database.example_data_1
collection.insert_many([
{"name":"张小十三","age":17,"address":"浙江"},
{"name":"张小十四","age":16,"address":"上海"},
{"name":"张小十五","age":14,"address":"山东"},
{"name":"张小十六","age":15,"address":"广东"},
{"name":"张小十七","age":12,"address":"广西"},
{"name":"张小十八","age":11,"address":"河南"},
{"name":"张小十九","age":13,"address":"河北"},
])
使用Python查询数据
rows = collection.find({'age':{'$lt':17,'$gt':14},'name':{'$ne':'张小十四'}})
for row in rows :
print(row)
使用Python更新数据
collection.update_one({'name':'张小十四'},{'$set':{'work':'新时代农民','age':22}},upsert = True)
更新操作还支持一个“upsert”参数。该参数的作用是:如果数据存在,则更新;如果数据不存在,则创建。
使用Python删除数据
collection.delete_many({'name':'张小十四'})
九、MongoDB与Python不通用的操作
1、空值
在MongoDB中,空值写作null。Python中,空值写作None
2、布尔值
在MongoDB中,“真”为true,“假”为false。Python中,“真”为True,“假”为False
3、排序参数
在MongoDB中
db.getCollection('example_data_1').find({'age':{'$gt':15}}).sort({'age':1})
Python中
rows = collection.find({'age':{'$gt':15}}).sort('age',1)
4、查询_id
在MongoDB中
db.getCollection('example_data_1').find({'_id':ObjectId("611b6afb1ca0761156dca3b6")})

Python中
from bson import ObjectId
rows = collection.find({'_id':ObjectId("611b6afb1ca0761156dca3b6")})
for row in rows :
print(row)
