目录
一、安装
二、简单操作
2-0 建立连接
2-1 建库(database)、建表(collection)
2-2 文档操作
2-2-1 增
2-2-2 删
2-2-3 改
2-2-4 查
2-3 索引建立
一、安装
二、简单操作
菜鸟教程 - MongoDB Python
mongoDB - 官方使用文档
PyMongo 官方文档
2-0 建立连接
import pymongo '''建立无用户名密码连接''' conn = pymongo.MongoClient('mongodb://localhost:27017/') # 同上 conn = pymongo.MongoClient('localhost', 27017) '''建立无用户名密码连接''' conn = pymongo.MongoClient("mongodb://user:password@socket_path") # 同上 conn = pymongo.MongoClient(host='localhost',port=27017 username='username', password='password')
2-1 建库(database)、建表(collection)
注意总结
- 在 MongoDB 中,数据库只有在内容插入后才会创建! 即,数据库创建后要创建集合(表)并插入一个文档(记录),数据库才会真正创建。
- mongodb 默认存在三个库 : test (可随意使用,默认登陆),admin (系统预留管理库),local(本地预留存储相关日志)
import pymongo # 建立无用户名密码连接 conn = pymongo.MongoClient('mongodb://localhost:27017/') # ----------------库操作----------------- # 查询所有库 db_list = conn.list_database_names() print(db_list) # ['local', 'test'] # 建库 mydb = conn['mymongo'] # 只有插入有文档的集合才能创建库 print(conn.list_database_names()) # ['local', 'test'] # ----------------集合操作(表)----------------- # 查询指定库中的所有表 col_list = mydb.list_collection_names() print(col_list) # [] # 表创建 :只有插入了文档 集合才能创建 mycol = mydb['mycollection'] # ----------------文档操作(数据)----------------- # 添加文档 mydoc = {"name": "hello mongo", "age": "18"} mycol.insert_one(mydoc) print(conn.list_database_names()) # ['local', 'mymongo', 'test'] print(mydb.list_collection_names()) # ['mycollection']
2-2 文档操作
2-2-1 增
insert_one 插入单个文档
import pymongo # 建立无用户名密码连接 默认使用 test库 conn = pymongo.MongoClient('mongodb://localhost:27017/') mydb = conn['mymongo'] mycol = mydb['mycollection'] # insert_one 插入单个文档 mydoc = {"name": "hello mongo 333", "age": "19"} obj = mycol.insert_one(mydoc) print(obj) #
# InsertOneResult 对象 返回插入文档的id值(唯一) print(obj.inserted_id) # 5cedf4a99e03ef3fad58d5f1 insert_many 批量插入文档
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] mylist = [ { "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" }, { "name": "QQ", "alexa": "101", "url": "https://www.qq.com" }, { "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" }, { "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" }, { "name": "Github", "alexa": "109", "url": "https://www.github.com" } ] x = mycol.insert_many(mylist) # InsertManyResult 对象 :输出插入的所有文档对应的 _id 值 print(x.inserted_ids)
指定 _id 的批量插入
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] mylist = [ { "_id": 1, "name": "RUNOOB", "cn_name": "菜鸟教程"}, { "_id": 2, "name": "Google", "address": "Google 搜索"}, { "_id": 3, "name": "Facebook", "address": "脸书"}, { "_id": 4, "name": "Taobao", "address": "淘宝"}, { "_id": 5, "name": "Zhihu", "address": "知乎"} ] x = mycol.insert_many(mylist) # 输出插入的所有文档对应的 _id 值 print(x.inserted_ids)
2-2-2 删
delete_one 删除指定文档,只删除第一个匹配到的
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] myquery = { "name": "Taobao" } mycol.delete_one(myquery)
delete_many 批量删除匹配文档
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] # 删除所有 name 字段中以 F 开头的文档: myquery = { "name": {"$regex": "^F"} } x = mycol.delete_many(myquery) print(x.deleted_count, "个文档已删除")
delete_many 不指定对象表示全删
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] x = mycol.delete_many({}) print(x.deleted_count, "个文档已删除")
指定集合.drop() 删除指定集合
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] mycol.drop()
2-2-3 改
update_one 修改指定对象,只修改匹配到的第一条
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] # 将 alexa 字段的值 10000 改为 12345(完全匹配) myquery = { "alexa": "10000" } newvalues = { "$set": { "alexa": "12345" } } mycol.update_one(myquery, newvalues)
update_many 修改所有匹配对象import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] # 查找所有以 F 开头的 name 字段,并将匹配到所有记录的 alexa 字段修改为 123 myquery = { "name": { "$regex": "^F" } } newvalues = { "$set": { "alexa": "123" } } x = mycol.update_many(myquery, newvalues) print(x.modified_count, "文档已修改")
2-2-4 查
find_one 返回查询集合的第一条数据
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] first_obj = mycol.find_one() print(first_obj) # {'_id': ObjectId('5cedf1239f152db6cd154ac0'), 'name': 'hello mongo', 'age': '18'}
find 查询集合中的所有数据,返回生成器
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] all_obj =mycol.find() print(all_obj) #
for obj in all_obj: print(obj) ''' {'_id': ObjectId('5cedf428c6baf396e2e2aa10'), 'name': 'hello mongo 2222', 'age': '19'} {'_id': ObjectId('5cedf4a99e03ef3fad58d5f1'), 'name': 'hello mongo 333', 'age': '19'} ''' # 查询指定字段的数据,需要返回的字段设置1,不返回设置0 for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }): print(x) # 除了 age 字段,其他全返回 print([ x for x in mycol.find({},{ "age": 0 })]) # 注意:除了 _id 你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。 # 如下:除了 id,同时指定0和1,报错 print([ x for x in mycol.find({},{ "age": 0,"name":1 })]) # 正确方式 print([ x for x in mycol.find({},{ "age": 0 })]) print([ x for x in mycol.find({},{ "name":1 })])
find 根据指定内容过滤查询
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] # 查找 name 字段为 "RUNOOB" 的数据 myquery = { "name": "RUNOOB" } mydoc = mycol.find(myquery) for x in mydoc: print(x) # 查询 id 为指定id的数据 post_id = ObjectId(...) mycol.find_one({"_id": post_id} # 注意,若id参数为字符串,需要手动将字符串变成id对象类型 post_id = '123' post_id = ObjectId(post_id)
find 的高级查询
mongo 官方高级查询文档 - 语法符查询
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] # 读取 name 字段中第一个字母 ASCII 值大于 "H" 的数据 myquery = { "name": { "$gt": "H" } } mydoc = mycol.find(myquery) for x in mydoc: print(x)
find 的正则表达式查询
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] # 读取 name 字段中第一个字母为 "R" 的数据 # 正则表达式修饰符条件为 {"$regex": "正则规则"} myquery = { "name": { "$regex": "^R" } } mydoc = mycol.find(myquery) for x in mydoc: print(x)
limit 指定查询条数的记录
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] # 返回 3 条文档记录 myresult = mycol.find().limit(3) # 输出结果 for x in myresult: print(x)
sort 查询指定规则排序的数据
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] # 对字段 alexa 按升序排序 mydoc = mycol.find().sort("alexa") for x in mydoc: print(x) # 降序排序 mydoc = mycol.find().sort("alexa", -1) for x in mydoc: print(x)
count_documents 查询文档数据条数
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] mycol = mydb['mycollection'] # 查看指定文档的所有数据,必须给予空字典参数 print(mycol.count_documents({})) # 2 # 查询指定文档的匹配数据 print(mycol.count_documents({'age':'19'})) # 1
2-3 索引建立
mongo 官方唯一索引创建文档
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = conn['mymongo'] # 建立 user_id 索引,并且确保它的唯一性 mydb.profiles.create_index([('user_id', pymongo.ASCENDING)], unique=True) # 对已有索引排序 print(sorted(list(mydb.profiles.index_information()))) user_profiles = [{'user_id': 211, 'name': 'Luke'}, {'user_id': 212, 'name': 'Ziltoid'}] res = mydb.profiles.insert_many(user_profiles) new_profile = {'user_id': 213, 'name': 'Drew'} result = mydb.profiles.insert_one(new_profile) # This is fine. # 不允许插入userid已经存在的文档,下方插入操作失败 # duplicate_profile = {'user_id': 212, 'name': 'Tommy'} # result = mydb.profiles.insert_one(duplicate_profile)