Mongodb 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。
Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接。
创建数据库需要使用 MongoClient 对象,并且指定连接的 URL 地址和要创建的数据库名。
具体的函数为:pymongo.MongoClient()
import pymongo
myclient=pymongo.MongoClient("mongodb://localhost:27017")
mydb=myclient["python_test"] #或者使用 myclient.python_test
mycol=mydb['sites'] #或者使用mydb.sites
doc={"name":"luan","age":26,"address":"shanghai"}
mycol.insert_one(doc)
dblist=myclient.list_database_names()
collist=mydb.list_collection_names()
x=mycol.find_one()
print(dblist,'\n',collist)
print(x)
运行结果为:
['admin', 'config', 'local', 'python_test', 'test']
['sites']
{'_id': ObjectId('5b501d3d80b39a1c2cd9bec4'), 'name': 'luan', 'age': 26, 'address': 'shanghai'}
对应的查看一下mongodb的数据库,可以发现已经创建成功:
插入文档可以插入一行,也可以出入多行 分别为 collection_name.insert_one,collection_name.insert_many(mylist)里面是一个字典的列表
使用.inserted_ids可以查看插入的文档的——id值。
x = mycol.insert_many(mylist) # 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)
也可以同时在字典中包含“_id”,来指定保存的id
import pymongo
myclient=pymongo.MongoClient("mongodb://localhost:27017")
mydb=myclient.python_test2
mycol=mydb.sites
doc={"name":"luan","age":26,"address":"shanghai"}
mylist=[
{ "_id":1,"name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" },
{ "_id":2,"name": "QQ", "alexa": "101", "url": "https://www.qq.com" },
{ "_id":3,"name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" }
]
mycol.insert_one(doc)
y=mycol.insert_many(mylist)
dblist=myclient.list_database_names()
collist=mydb.list_collection_names()
#mycol.delete_many({})
x=mycol.find()
print(dblist,'\n',collist)
for each in x:
print(each)
输出为:
查询第一条数据可以使用collection_name.find_one,查询所有数据可以使用collection_name.find(),
import pymongo
myclient=pymongo.MongoClient("mongodb://localhost:27017")
mydb=myclient.python_test2
mycol=mydb.sites
#mycol.delete_many({})
x=mycol.find_one()
y=mycol.find()
print(x)
print(y)
输出结果:
{'_id': ObjectId('5b504b8a80b39a2208c5700e'), 'name': 'luan', 'age': 26, 'address': 'shanghai'}
指定条件查找,可以使用find({query})
import pymongo
myclient=pymongo.MongoClient("mongodb://localhost:27017")
mydb=myclient.python_test2
mycol=mydb.sites
y=mycol.find({"name":"QQ"}) #在字典中指定查询的 条件 当大括号中没有内容时,等同于find()
print(y)
for each in y:
print(each)
输出为:
{'_id': 2, 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
在字典中指定查询的 条件 当大括号中没有内容时,等同于find()
如果要查询指定字段的数据,需要将返回的字段的值设为1,并且除了id之外,不能够在同一个对象中同时指定0 和1 。
如 {"name":0,"url":1}的写法会报错
import pymongo
myclient=pymongo.MongoClient("mongodb://localhost:27017")
mydb=myclient.python_test2
mycol=mydb.sites
y=mycol.find({},{"_id":0,"name":1})
for each in y:
print(each)
输入为:
{'name': 'luan'}
{'name': 'Taobao'}
{'name': 'QQ'}
{'name': 'Facebook'} 可以看到只显示了“name”字段
如果设置 了一个字段为0,那么其他的将全为1 如:
import pymongo
myclient=pymongo.MongoClient("mongodb://localhost:27017")
mydb=myclient.python_test2
mycol=mydb.sites
y=mycol.find({},{"name":0,"url":0})
for each in y:
print(each)
输出为:
{'_id': ObjectId('5b504b8a80b39a2208c5700e'), 'age': 26, 'address': 'shanghai'}
{'_id': 1, 'alexa': '100'}
{'_id': 2, 'alexa': '101'}
{'_id': 3, 'alexa': '10'}
高级查询
查询的条件语句中,我们还可以使用修饰符。可以使用mongo中的修饰符:$gt $lt #gte 等等。
myquery={"alexa":{"$gt":102}}
for x in mycol.find(myquery):
print(x)
输出结果为:
{'_id': ObjectId('5b509f9139dcdf11acc0a3ff'), 'name': 'RUNOOB', 'alexa': 10000, 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5b509f9139dcdf11acc0a402'), 'name': '知乎', 'alexa': 103, 'url': 'https://www.zhihu.com'}
我们还可以使用正则表达式作为修饰符。
正则表达式修饰符只用于搜索字符串的字段。 正则表达式修饰符条件为 {"$regex": "条件"} :
myquery={"name":{"$regex":"^T"}}
for x in mycol.find(myquery):
print(x)
输出为:
{'_id': ObjectId('5b509f9139dcdf11acc0a400'), 'name': 'Taobao', 'alexa': 100, 'url': 'https://www.taobao.com'}
如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。同mongo语法一致
还可以跳过指定的条数: 可以使用skip()函数。
我们可以在 MongoDB 中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。
如果查找到的匹配数据多余一条,则只会修改第一条。 方法有“set 设置 ” 和“ inc 加 ”方法
myquery={"alexa":10000}
newvalues={"$set":{"alexa":10001}}
mycol.update_one(myquery,newvalues)
y= mycol.find()
for x in y:
print(x)
输出(部分):
{'_id': ObjectId('5b509f9139dcdf11acc0a3ff'), 'name': 'RUNOOB', 'alexa': 10001, 'url': 'https://www.runoob.com'}
myquery={"alexa":10001}
newvalues={"$inc":{"alexa":10002}}
mycol.update(myquery,newvalues)
y= mycol.find()
for x in y:
print(x)
输出:(部分)
{'_id': ObjectId('5b509f9139dcdf11acc0a3ff'), 'name': 'RUNOOB', 'alexa': 20003, 'url': 'https://www.runoob.com'}
使用update_many 可以修改多条文档:方法类似。
myquery={"alexa":{"$gt":100}}
newvalues={"$set":{"alexa":111}}
mycol.update_many(myquery,newvalues)
y= mycol.find()
for x in y:
print(x)
输出结果:
{'_id': ObjectId('5b509f9139dcdf11acc0a3ff'), 'name': 'RUNOOB', 'alexa': 111, 'url': 'https://www.runoob.com'}
{'_id': ObjectId('5b509f9139dcdf11acc0a400'), 'name': 'Taobao', 'alexa': 100, 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5b509f9139dcdf11acc0a401'), 'name': 'QQ', 'alexa': 111, 'url': 'https://www.qq.com'}
{'_id': ObjectId('5b509f9139dcdf11acc0a402'), 'name': '知乎', 'alexa': 111, 'url': 'https://www.zhihu.com'}