MongoDB学习笔记:Python 操作MongoDB
MongoDB学习笔记:Python 操作MongoDB
Pymongo 安装
安装pymongo
pip install pymongo
PyMongo是驱动程序,使python程序能够使用Mongodb数据库,使用python编写而成;
数据库相关操作
连接及创建数据库
import pymongo
connect = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = connect ["test"]
注意:在 MongoDB 中,初次创建数据库,数据库在获取内容之前不会真正创建的!
在实际创建数据库(和集合)之前,MongoDB 会一直等待您创建至少有一个文档(记录)的集合(表)。
连接及查看数据库
from pymongo import MongoClient
connect = MongoClient(host='localhost', port=27017, username="root", password="123456")
#connect = MongoClient('mongodb://localhost:27017/', username="root", password="123456")
print(connect.list_database_names())
单例模式封装链接
注意:
mongodb的数据库连接池的问题,在创建MongoClient 的时候就已经创建了一个连接池,每一个操作(增删改查等)都会获取一个连接,执行操作后释放连接。
而连接池是不需要我们及时关闭的,我们可以在程序的生命周期中维护一个这样的单例,至于从连接池中拿出的连接,我们也不需要自行关闭。
所以这里self.db实例其实已经是一个现成的连接池了,而且线程安全。内置的连接池默认初始了100个连接,每一个操作(增删改查等)都会获取一个连接,执行操作后释放连接。
最大连接限制最大连接数限制,默认值为 1000000。
如果你需要为进程中支持大量并发MongoDB操作,请增加maxPoolSize:
client = MongoClient(host, port, maxPoolSize=200)
或使其不受限制:
client = MongoClient(host, port, maxPoolSize=None)
一旦池达到最大大小,其他线程就必须等待套接字可用。PyMongo并不限制等待套接字可用的线程数,应用程序有责任在负载高峰期间将其线程池的大小限制为绑定队列。除非waitQueueTimeoutMS定义,否则允许线程等待任何时间长度 :
client = MongoClient(host, port, waitQueueTimeoutMS=100)
等待套接字等待时间超过100ms(在此示例中)的线程引发 ConnectionFailure。如果限制负载高峰期间的操作持续时间比完成每个操作更为重要,请使用此选项。
另外不要为了每个操作都去创建一个新的MongoClient实例,这是非常低效的。
from pymongo import MongoClient class MongoDBClient(object):
# 饿汉式 单例模式
def __new__(cls):
if not hasattr(cls, 'instance'):
cls.instance = super(MongoDBClient, cls).__new__(cls)
return cls.instance
# 代理ip Redis 连接池
def __init__(self):
uri = 'mongodb://账号:密码@128.777.244.19:27017/admin'
self.mgdb = MongoClient(uri, connect=False, maxPoolSize=2000) def getMongoClient(self):
return self.mgdb
集合相关操作
检查 "customers" 集合是否存在
from pymongo import MongoClient
connect = MongoClient(host='localhost', port=27017, username="root", password="123456")
#connect = MongoClient('mongodb://localhost:27017/', username="root", password="123456")
collist = mydb.list_collection_names()
if "customers" in collist:
print("The collection exists.")
创建名为 "customers" 的集合
import pymongo
connect = pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["test"]
mycol = test_db["customers"]
获取数据库及集合实例
from pymongo import MongoClient
connect = MongoClient(host='localhost', port=27017, username="root", password="123456")
获取数据库实例
test_db = connect['test']
获取collection实例
collection = test_db['students']
删除数据库下的集合
使用drop() 方法删除在 MongoDB 中的集合。
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
mycol.drop()
注意:如果成功删除集合,则 drop() 方法返回 true,如果集合不存在则返回 false。
文档相关操作
插入文档
在集合中插入单个文档
insert_one() 方法的第一个参数是字典,其中包含希望插入文档中的每个字段名称和值。
from pymongo import MongoClient
from datetime import datetime connect = MongoClient(host='localhost', port=27017, username="root", password="123456",)
# 获取db
test_db = connect['test']
# 获取collection
collection = test_db['students']
# 构建document
document = {"author": "Mike", "text": "My first blog post!", "tags": ["mongodb", "python", "pymongo"], "date": datetime.now()}
# 插入document
one_insert = collection.insert_one(document=document)
print(one_insert.inserted_id)
注意:insert_one() 方法返回 InsertOneResult 对象,该对象拥有属性 inserted_id,用于保存插入文档的 id。
在集合中插入多个文档
insert_many() 方法的第一个参数是包含字典的列表,其中包含要插入的数据:
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
mylist = [
{ "name": "Amy", "address": "Apple st 652"},
{ "name": "Hannah", "address": "Mountain 21"},
{ "name": "Michael", "address": "Valley 345"},
{ "name": "Sandy", "address": "Ocean blvd 2"},
{ "name": "Betty", "address": "Green Grass 1"},
{ "name": "Richard", "address": "Sky st 331"},
{ "name": "Susan", "address": "One way 98"},
{ "name": "Vicky", "address": "Yellow Garden 2"},
{ "name": "Ben", "address": "Park Lane 38"},
{ "name": "William", "address": "Central st 954"},
{ "name": "Chuck", "address": "Main Road 989"},
{ "name": "Viola", "address": "Sideway 1633"}
]
x = mycol.insert_many(mylist)
# 打印被插入文档的 _id 值列表:
print(x.inserted_ids)
注意:insert_many() 方法返回 InsertManyResult 对象,该对象拥有属性 inserted_ids(id列表),用于保存被插入文档的 id。
插入带有指定 ID 的多个文档
如果您不希望 MongoDB 为您的文档分配唯一 id,则可以在插入文档时指定 _id 字段。
请记住,值必须是唯一的。两个文件不能有相同的 _id。
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
mylist = [
{ "_id": 1, "name": "John", "address": "Highway 37"},
{ "_id": 2, "name": "Peter", "address": "Lowstreet 27"},
{ "_id": 3, "name": "Amy", "address": "Apple st 652"},
{ "_id": 4, "name": "Hannah", "address": "Mountain 21"},
{ "_id": 5, "name": "Michael", "address": "Valley 345"},
{ "_id": 6, "name": "Sandy", "address": "Ocean blvd 2"},
{ "_id": 7, "name": "Betty", "address": "Green Grass 1"},
{ "_id": 8, "name": "Richard", "address": "Sky st 331"},
{ "_id": 9, "name": "Susan", "address": "One way 98"},
{ "_id": 10, "name": "Vicky", "address": "Yellow Garden 2"},
{ "_id": 11, "name": "Ben", "address": "Park Lane 38"},
{ "_id": 12, "name": "William", "address": "Central st 954"},
{ "_id": 13, "name": "Chuck", "address": "Main Road 989"},
{ "_id": 14, "name": "Viola", "address": "Sideway 1633"}
]
x = mycol.insert_many(mylist)
# 打印被插入文档的 _id 值列表:
print(x.inserted_ids)
更新集合
更新集合中的单个文档
update_one() 方法来更新 MongoDB 集合中的文档。
第一个参数是 query 对象,用于定义要更新的文档。
第二个参数是定义文档新值的对象。
注意:如果查询找到多个记录,则仅更新第一个匹配项。
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
myquery = { "address": "Valley 345" }
newvalues = { "$set": { "address": "Canyon 123" } }
mycol.update_one(myquery, newvalues)
#print "customers" after the update:
for x in mycol.find():
print(x)
更新集合中的多个文档
更新符合查询条件的所有文档,需要使用 update_many() 方法。
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
myquery = { "address": { "$regex": "^S" } }
newvalues = { "$set": { "name": "Minnie" } }
x = mycol.update_many(myquery, newvalues)
print(x.modified_count, "documents updated.")
删除文档
删除单个文档
要删除一个文档,我们使用 delete_one() 方法。
delete_one() 方法的第一个参数是 query 对象,用于定义要删除的文档。
注释:如果查询找到了多个文档,则仅删除第一个匹配项。
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
myquery = { "address": "Mountain 21" }
mycol.delete_one(myquery)
删除多个文档
要删除多个文档,请使用 delete_many() 方法。
delete_many() 方法的第一个参数是一个查询对象,用于定义要删除的文档。
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
myquery = { "address": {"$regex": "^S"} }
x = mycol.delete_many(myquery)
print(x.deleted_count, " documents deleted.")
删除集合中的所有文档
删除集合中的所有文档,请把空的查询对象传递给 delete_many() 方法
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
x = mycol.delete_many({})
print(x.deleted_count, " documents deleted.")
查找文档
查找单条文档
我们可以使用 find_one() 方法,find_one() 方法返回选择中的第一个匹配项。
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
x = mycol.find_one()
print(x)
查找全部
如需从 MongoDB 中的表中选取数据,我们还可以使用 find() 方法。
find() 方法返回选择中的所有匹配项。
find() 方法的第一个参数是 query 对象。在这个例子中,我们用了一个空的 query 对象,它会选取集合中的所有文档。
find() 方法的第二个参数是描述包含在结果中字段的对象。此参数是可选的,如果省略,则所有字段都将包含在结果中。
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
for x in mycol.find():
print(x)
返回部分字段
使用find时,第二个参数字典中,需要返回的字段设置为1,不需要返回的字段为0。
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
for x in mycol.find({},{ "_id": 0, "name": 1, "address": 1 }):
print(x)
查找多条数据
from pymongo import MongoClient
from datetime import datetime
connect = MongoClient(host='localhost', port=27017, username="root", password="123456",)
# 获取db
test_db = connect['test']
# 获取collection
collection = test_db['students']
documents = [{"author": "Mike","text": "Another post!","tags": ["bulk", "insert"], "date": datetime(2009, 11, 12, 11, 14)},
{"author": "Eliot", "title": "MongoDB is fun", "text": "and pretty easy too!", "date": datetime(2009, 11, 10, 10, 45)}]
collection.insert_many(documents=documents) # 通过条件过滤出多条document
documents = collection.find({"author": "Mike"})
计数
如果我们只想知道有多少文档与某个查询匹配,我们可以执行count_documents()操作而不是完整查询。
我们以上一个程序为例,可以对集合中的所有文档进行计数:
collection.count_documents({}) #返回结果:2
或仅与特定查询匹配的那些文档:
collection.count_documents({"author": "Mike"}) #返回结果:1
Query查询
待续
结果排序
sort() 方法按升序或降序对结果进行排序。
sort() 方法为 "fieldname"(字段名称)提供一个参数,为 "direction"(方向)提供一个参数(升序是默认方向)
按姓名的字母顺序对结果进行排序:
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
mydoc = mycol.find().sort("name")
for x in mydoc:
print(x)
那么如何做降序排序?
使用值 -1 作为第二个参数进行降序排序。
sort("name", 1) # 升序
sort("name", -1) # 降序
按名称的逆向字母顺序对结果进行排序:
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
mydoc = mycol.find().sort("name", -1)
for x in mydoc:
print(x)
返回结果限制
限制 MongoDB 中的结果,我们使用 limit() 方法。
limit() 方法接受一个参数,定义的数字表示返回的文档数。
把结果限定为只返回 5 个文档:
import pymongo
connect= pymongo.MongoClient("mongodb://localhost:27017/")
test_db= connect["mydatabase"]
mycol = test_db["customers"]
myresult = mycol.find().limit(5)
# 打印结果:
for x in myresult:
print(x)
在多进程中使用
绝不能将MongoClient实例从父进程复制到子进程。相反,父进程和每个子进程必须创建自己的MongoClient实例。例如:
# Each process creates its own instance of MongoClient.
def func():
db = pymongo.MongoClient().mydb
# Do something with db. proc = multiprocessing.Process(target=func)
proc.start()
永远不要这样做:
client = pymongo.MongoClient() # Each child process attempts to copy a global MongoClient
# created in the parent process. Never do this.
def func():
db = client.mydb
# Do something with db. proc = multiprocessing.Process(target=func)
proc.start()
由于fork(),线程和锁之间固有的不兼容性,从父进程复制的MongoClient实例在子进程中极有可能出现死锁 。如果有可能发生这种死锁,PyMongo将尝试发出警告。
MongoDB学习笔记:Python 操作MongoDB的更多相关文章
- MongoDB 学习笔记(python操作)
转自: http://blog.csdn.net/daillo/article/details/7030910
- MongoDB学习笔记一:MongoDB的下载和安装
MongoDB学习笔记一:MongoDB的下载和安装 趁着这几天比較空暇,准备学习一下MongoDB数据库.今天就简单的学习了一些MongoDB的下载和安装.并创建了存储MongoDB的数据仓库. 将 ...
- MongoDB学习笔记一:MongoDB基础
目录 MongoDB是什么? 学了有什么用? MongoDB入门 安装 修改数据库位置 MongoDB的启动方式 MongoDB的图形化工具 MongoDB基本命令 增 查询 更新 删除 排序 投影 ...
- MongoDB学习笔记(1):MongoDB简介
1. MongoDB的特点: (1) 易于使用 MongoDB是一个面向文档的数据库,非关系型数据库.通过在文档中嵌入式文档和数据,面向对象的方法能够仅使用一条记录来表现复杂的层次关系.文档的键和值不 ...
- MongoDB学习笔记(数据操作)
1. 批量插入: 以数组的方式一次插入多个文档可以在单次TCP请求中完成,避免了多次请求中的额外开销.就数据传输量而言,批量插入的数据中仅包含一份消息头,而多次单条插入则会在每次插入数据时封 ...
- MongoDB学习笔记——聚合操作之聚合管道(Aggregation Pipeline)
MongoDB聚合管道 使用聚合管道可以对集合中的文档进行变换和组合. 管道是由一个个功能节点组成的,这些节点用管道操作符来进行表示.聚合管道以一个集合中的所有文档作为开始,然后这些文档从一个操作节点 ...
- MongoDB学习笔记——聚合操作之MapReduce
MapReduce MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,value) ...
- MongoDB学习笔记——聚合操作之group,distinct,count
单独的聚合命令(group,distinct,count) 单独聚合命令 比aggregate性能低,比Map-reduce灵活度低:但是可以节省几行javascript代码,后面那句话我自己加的,哈 ...
- MongoDB学习笔记——数据库操作
使用use数据库名称来创建数据库,如果该数据库已经存在则返回这个数据库 语句格式:use DATABASE_NAME >use mynewdb switched to db mynewdb 使用 ...
随机推荐
- k8s job 控制器
Job控制器可以执行3种类型的任务 1)一次性任务 2)串式任务 spec.completions 3)并形式任务 spec.parallelism 默认Job执行后,不会自动删除,需要手动删除,例如 ...
- Amazon EFS CSI 驱动程序 为eks 提供存储服务
官方文档:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/efs-csi.html
- Ionic5整合极光推送JPush ( 简单 )
项目初始化 1. 安装项目依赖: # 安装cordova插件 ionic cordova plugin add jpush-phonegap-plugin --variable APP_KEY=&qu ...
- Rabbitmq 3.6.5以上版本修改端口号方法
Rabbitmq 3.6.5以上版本修改端口号方法,网上查了下有一些方不管用,所以自己实践了引用官网说明 https://www.rabbitmq.com/configure.html#configu ...
- BPM系统,工作流引擎,表单引擎常用30个功能与常见问题
1.1:支持国际化 如果使用工具包的模式开发,支持国际化的工作由自己完成的. 如果使用Ccbpm 的前端,主要的功能页面已经支持, 后台的设置的页面全部中文,没有做支持国际化. 1.2:能单独部署,微 ...
- Python 极速入门指南
前言 转载于本人博客. 面向有编程经验者的极速入门指南. 大部分内容简化于 W3School,翻译不一定准确,因此标注了英文. 包括代码一共两万字符左右,预计阅读时间一小时. 目前我的博客长文显示效果 ...
- 1.1.08- Python变量的关联,绑定,引用
Python中关联.绑定,引用的含义: 在Python中,变量没有类型 关联/绑定/引用都是指变量和一个对象的关联关系. 在交互模式下查看变量的绑定关系: >>>help(" ...
- windows CMD实现的信息收集工具
bat1 @echo off echo ====================================================== echo [*] 所有盘符下的有趣文件 @For ...
- CTB-Locker敲诈者病毒下载器分析
一. 样本基本信息 样本名称:927354529512.scr 样本大小:110592 字节 病毒名称:Win32.Trojan.Ctb-locker.Auto 样本MD5值:3A6D7E551C13 ...
- PowerBI开发 第十九篇:基于Page创建Tooltip
在PowerBI 报表中,常规的Tooltip是一段文本,当光标悬停在Visual上,Visual上方会自动显示Tooltip的文本.PowerBI 支持用户自定义内容丰富的Tooltip,用户通过创 ...