MongoDB基本概念
连接数据库
######### 方法一 ##########
import pymongo
# MongoClient()返回一个mongodb的连接对象client
client = pymongo.MongoClient(host="localhost",port=27017)
######### 方法二 ##########
import pymongo
# MongoClient的第一个参数host还可以直接传MongoDB的连接字符串,以mongodb开头
client = pymongo.MongoClient(host="mongodb://127.0.0.1:27017/")
创建/指定数据库
###### 方法一 ######
# 指定test数据库
db = client.test
###### 方法二 ######
# 指定test数据库(调用client的test属性即可返回test数据库)
db = client["test"]
查看数据库
client.list_database_names()
['local', 'test', 'admin', 'medical']
指定/插入集合
###### 方法一 ######
# 指定student集合
collection = db.student
###### 方法二 ######
# 指定student集合
collection = db["student"]
增:插入文档/数据
pymongo 3.x版本中,insert()方法官方已不推荐使用,推荐使用**insert_one()和insert_many()**将插入单条和多条记录分开。
- db.collection.insert_one()
用于插入单条记录,返回的是InsertOneResult对象
student = {
'name': 'Jordan',
'age': 18,
'gender': 'man'
}
result = collection.insert_one(student)
# insert_one()返回的是InsertOneResult对象,我们可以调用其inserted_id属性获取_id。
print(result) # <pymongo.results.InsertOneResult object at 0x10d68b558>
print(result.inserted_id) # 5932ab0f15c2606f0c1cf6c5
- db.collection.insert_many()
用于插入多条记录,返回的是InsertManyResult对象
student1 = {
'name': 'Jordan',
'age': 10,
'gender': 'man'
}
student2 = {
'name': 'Mike',
'age': 11,
'gender': 'man'
}
result = collection.insert_many([student1, student2])
# insert_many()方法返回的类型是InsertManyResult,调用inserted_ids属性可以获取插入数据的_id列表
print(result) # <pymongo.results.InsertManyResult object at 0x101dea558>
print(result.inserted_ids) # [ObjectId('5932abf415c2607083d3b2ac'), ObjectId('5932abf415c2607083d3b2ad')]
查 : 查询数据
查找全部数据 find()
collection.find() #<pymongo.cursor.Cursor at 0x7fdc2bf4ac50> 返回一个对象
for i in collection.find():
print (i)
#{'_id': ObjectId('5dc7a74df971b26b5833f454'), 'name': 'Jordan', 'age': 18, 'gender': 'man'}
#{'_id': ObjectId('5dc7a808f971b26b5833f455'), 'name': 'Jordan', 'age': 10, 'gender': 'man'}
#{'_id': ObjectId('5dc7a808f971b26b5833f456'), 'name': 'Mike', 'age': 11, 'gender': 'man'}
results = collection.find({"age":18})
print(results) # <pymongo.cursor.Cursor object at 0x1032d5128>
for result in results:
print(result)
# <pymongo.cursor.Cursor object at 0x7fdc28a2ac50>
#{'_id': ObjectId('5dc7a74df971b26b5833f454'), 'name': 'Jordan', 'age': 18, 'gender': 'man'}
查询单个数据 find_one()
collection.find_one({'name':'Mike'})
# 结果
{'_id': ObjectId('5dc7a808f971b26b5833f456'),
'name': 'Mike',
'age': 11,
'gender': 'man'}
查询条件
# age大于10岁的
for i in collection.find({'age':{'$gt':10}}):
print (i)
#{'_id': ObjectId('5dc7a74df971b26b5833f454'), 'name': 'Jordan', 'age': 18, 'gender': 'man'}
#{'_id': ObjectId('5dc7a808f971b26b5833f456'), 'name': 'Mike', 'age': 11, 'gender': 'man'}
# 注意 $get 上要加引号
多条件查询
多条件查询 $and
$or
## and查询
res = collection.find({'age':{'$gt':10}} , {'gender' : 'man'})
for i in res:
print (i)
#{'_id': ObjectId('5dc7a74df971b26b5833f454'), 'gender': 'man'}
#{'_id': ObjectId('5dc7a808f971b26b5833f456'), 'gender': 'man'}
## or查询
res = collection.find({
'$or':[{'age':{'$gt':10}} , {'gender' : 'man'}]
})
for i in res:
print (i)
#{'_id': ObjectId('5dc7a74df971b26b5833f454'), 'name': 'Jordan', 'age': 18, 'gender': 'man'}
#{'_id': ObjectId('5dc7a808f971b26b5833f455'), 'name': 'Jordan', 'age': 10, 'gender': 'man'}
#{'_id': ObjectId('5dc7a808f971b26b5833f456'), 'name': 'Mike', 'age': 11, 'gender': 'man'}
获取文档个数 count()
collection.find().count()
3
排序 sort()
排序 sort()
调用sort方法,传入要排序的字段and升降序标志即可
# 默认升序
res = collection.find().sort('age',pymongo.ASCENDING)
for i in res:
print (i)
#{'_id': ObjectId('5dc7a808f971b26b5833f455'), 'name': 'Jordan', 'age': 10, 'gender': 'man'}
#{'_id': ObjectId('5dc7a808f971b26b5833f456'), 'name': 'Mike', 'age': 11, 'gender': 'man'}
#{'_id': ObjectId('5dc7a74df971b26b5833f454'), 'name': 'Jordan', 'age': 18, 'gender': 'man'}
# 降序
res = collection.find().sort('age',pymongo.DESCENDING)
for i in res:
print (i)
#{'_id': ObjectId('5dc7a74df971b26b5833f454'), 'name': 'Jordan', 'age': 18, 'gender': 'man'}
#{'_id': ObjectId('5dc7a808f971b26b5833f456'), 'name': 'Mike', 'age': 11, 'gender': 'man'}
#{'_id': ObjectId('5dc7a808f971b26b5833f455'), 'name': 'Jordan', 'age': 10, 'gender': 'man'}
skip
跳过查询的记录
# 查询全部
results = collection.find().sort('name', pymongo.ASCENDING)
print ([result['name'] for result in results])
#['Jordan', 'Jordan', 'Mike']
# skip(2)
results = collection.find().sort('name', pymongo.ASCENDING).skip(2)
print ([result['name'] for result in results])
['Mike']
**注意:*在数据量非常庞大时(千万、亿级别),最好不要用skip()来查询数据,可能导致内存溢出。可以使用
find({'_id': {'$gt': ObjectId('593278c815c2602678bb2b8d')}})
这样的方法来查询。
limit()
读取指定数量的数据记录
results = collection.find().sort('name', pymongo.ASCENDING).limit(1)
print([result['name'] for result in results])
# ['Jordan']
改 : 更新数据
- db.collection.update_one()
修改单条文档,返回结果是UpdateResult类型
result = collection.update_one(
{"name" : "Mike"} ,
{
"$inc" : {"age" : 5},
"$set": {"gender": "male"}
}
)
print(result) # <pymongo.results.UpdateResult object at 0x10d17b678>
print(result.matched_count, result.modified_count) # 1 1
collection.update_one({'name':'Mike'},
{'$set':{'gender':'qqq'}})
for i in collection.find():
print (i)
{'_id': ObjectId('5dc7a74df971b26b5833f454'), 'name': 'Jordan', 'age': 18, 'gender': 'man'}
{'_id': ObjectId('5dc7a808f971b26b5833f455'), 'name': 'Jordan', 'age': 10, 'gender': 'man'}
{'_id': ObjectId('5dc7a808f971b26b5833f456'), 'name': 'Mike', 'age': 21, 'gender': 'qqq'}
$inc
- 使用$inc操作符将一个字段的值增加或者减少的格式是 :
{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }
- $inc操作符接收正的和负的值
如果指定的字段不存在则$inc操作符创建这个字段并且设置这个字段的值为指定的在值 ,存在则不变
$set
用于更新
update_one() 方法只能修匹配到的第一条记录,如果要修改所有匹配到的记录,可以使用 update_many()
方法一样
删: 删除数据
删除全部
collection.remove()
# {'ok': 1, 'n': 3}
删除一条
result = collection.delete_one({'name': 'Kevin'})
print(result) # <pymongo.results.DeleteResult object at 0x10e6ba4c8>
print(result.deleted_count) # 1
删除多条
result = collection.delete_many({'name': 'Kevin'})
print(result) # <pymongo.results.DeleteResult object at 0x55e6be5f1>
print(result.deleted_count) # 4
删除集合
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
mycol.drop()