Mongodb - PyMongo - 基本使用

目录

一、安装

二、简单操作

2-0 建立连接

2-1 建库(database)、建表(collection)

2-2 文档操作

2-2-1 增

2-2-2 删

2-2-3 改

2-2-4 查

2-3 索引建立


一、安装

Mongodb - PyMongo - 基本使用_第1张图片

二、简单操作

菜鸟教程 - 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']
​

Mongodb - PyMongo - 基本使用_第2张图片

 

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 })])

Mongodb - PyMongo - 基本使用_第3张图片

 

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)
 

你可能感兴趣的:(NoSQL)