python 操作 mongodb

本贴最后更新于 1518 天前,其中的信息可能已经沧海桑田

pymongo 同步查找 MongoDB 数据库:

1.导库:

import pymongo from pymongo import * import pprint

2.创建连接实例:

#创建连接实例 #无密码连接方式
 client = pymongo.MongoClient('10.47.29.26', 27030) 
# client = MongoClient('mongodb://10.47.29.26:27030/') 

#或者这样 # 有密码连接 
 client =MongoClient('mongodb://chenruhai:11080226@localhost:27017/dbname')

3.获取数据库与集合连接实例对象(没有的话会自动创建)

# 获取数据库实例 
db = client.zfdb 

#或者通过函数方式访问: 
client.get_database("zfdb") # db = client['zfdb'] 

#获取集合
 test = db.test 
# test = db.get_collection("test")

4.插入文档:

插入一条文档:

person = {'name': 'zone1','sex':'boy'} 
person_id = test.insert_one(person).inserted_id 
#插入数据之后获取_id 
print(person_id) 
#insert_one()返回的是InsertOneResult对象,我们可以调用其inserted_id属性获取_id。

插入多条文档:

# 批量插入 
persons = [{'name': 'zone', 'sex': 'boy'}, {'name': 'zone', 'sex': 'boy1'}, {'name': 		 'qone', 'sex': 'girl'}, {'name': 'qone1', 'sex': 'girl'}] 
result = test.insert_many(persons) print(result.inserted_ids)

5.删除文档

#删除单挑记录,将会删除匹配到的第一条记录:

result1 = test.delete_one({'name': 'zone'}) pprint.pprint(result1)
#批量删除:(删除所有匹配到的满足条件的记录)

result1 = test.delete_many({'sex': 'girl'}) print(result1)

6.更新文档:

更新单条记录:

res = test.update_one({'name': 'zone'}, {'$set': {'sex': 'boy'}}) 
print(res.matched_count)

更新多条记录:

test.update_many({'sex': 'boy'}, {'$set': {'sex': 'girl'}})

7.查询文档:

查找单条记录,返回匹配到的第一条数据:

find_post = test.find_one({"name":"zone1"}) 
print("查找一条记录的结果:\n",find_post)
查找多条记录,可以添加查找条件:

find_posts = test.find({"sex": "girl"})
 #没有条件将是所有数据,这里得到所有sex为girl的数据 
print('\n',list(find_posts))

异步操作 mongodb 数据库----非常适合大量数据操作的情况

注:浏览之前请学习异步编程相关知识

导库:

import asyncio from motor.motor_asyncio 
import AsyncIOMotorClient from motor 
import * import pprint 
#以下是为了防止asyncio存在滞留进程 
import nest_asyncio 
nest_asyncio.apply()

1.创建数据库连接实例对象:

# 普通连接 
client = AsyncIOMotorClient('10.47.29.26',27030) 
# client = AsyncIOMotorClient('mongodb://localhost:27017') 

# 副本集连接 
# client = AsyncIOMotorClient('mongodb://host1,host2/?replicaSet=my-replicaset-name') 

# 密码连接 
# client =AsyncIOMotorClient('mongodb://username:password@10.47.29.26:27030/dbname')

2.获取数据库和集合连接对象


# 获取数据库 
db = client.zfdb 
# db = client['zfdb'] 

# 获取 collection 
collection = db.test_collection 
# collection = db['test']

3.插入文档:

增加一条记录:

async def do_insert(): 
	document = {'name': 'zone','sex':'boy'} 
	result = await db.test_collection.insert_one(document) 
	#需要插入多条文档在上面两行修改代码即可 
	print('result %s' % repr(result.inserted_id)) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(do_insert())
批量增加记录:

async def do_insert(): 
	result = await db.test_collection.insert_many(
				[~~~~
					{'name': i, 'sex': str(i + 2)}for i in range(20)
				]) 
	print('inserted %d docs' % (len(result.inserted_ids),)) 

loop = asyncio.get_event_loop()
loop.run_until_complete(do_insert())

4.查询文档:

查找一条记录:

async def do_find_one(): 
	document = await db.test_collection.find_one({'name': 'zone'}) 	
	pprint.pprint(document)

loop = asyncio.get_event_loop() 
loop.run_until_complete(do_find_one())
查找多条记录--查找记录可以添加筛选条件:

async def do_find(): 
	cursor = db.test_collection.find({'name': {'$lt': 5}}).sort('i') 
	for document in await cursor.to_list(length=100):
		 pprint.pprint(document)
loop = asyncio.get_event_loop()
loop.run_until_complete(do_find()) 
print("\n") 

# 添加筛选条件: 
# 添加筛选条件---排序、跳过、限制返回结果数 
async def do_find(): 
	cursor = db.test_collection.find({'name': {'$lt': 4}}) 
	# 在迭代之前修改查询 
	cursor.sort('name', -1).skip(1).limit(2) 
	#先按照name从大到小排序,跳过一条,限制输出前两条,原本应该输出四条 	
	async for document in cursor: 
		pprint.pprint(document) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(do_find())

5.更新文档:

更新指定文档的字段,不会影响到其他无关的文档的内容:

async def do_update(): 
	coll = db.test_collection 
	result = await coll.update_one({'name': 0}, {'$set': {'sex': 'girl'}}) #更新操作 
	print('更新条数: %s ' % result.modified_count)
	new_document = await coll.find_one({'name': 0}) 
	print('更新结果为: %s' % pprint.pformat(new_document)) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(do_update())

更新多条记录与此类似。

6.删除文档:

删除指定记录:

async def do_delete_many(): 
	coll = db.test_collection 
	n = await coll.count_documents({}) 
	print('删除前有 %s 条数据' % n) 
	result = await db.test_collection.delete_many({'name': {'$gte': 10}}) #删除条件 
	print('删除后 %s ' % (await coll.count_documents({}))) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(do_delete_many())

7.统计文档

async def do_count(): 
	n = await db.test_collection.count_documents({}) 
	print('%s 条文档在集合中' % n) 
	n = await db.test_collection.count_documents({'name': {'$gt': 8}}) 
	print('%s 条文档在集合中,当 i > 8时' % n) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(do_count())

8.替换文档:

与更新文档不同,替换文档是将所有内容替换掉,或者是留下某些内容;(包括字段与值)

async def do_replace(): 
	coll = db.test_collection 
	old_document = await coll.find_one({'name': 'zone'}) #寻找到目标文档 
	print('替换前: %s' % pprint.pformat(old_document)) 
	_id = old_document['_id'] #获取原文档的_id 
	result = await coll.replace_one({'_id': _id}, {'sex': 'hanson boy'}) #替换整条文档,在该文档中,原来的name字段将会消失 
	print('replaced %s document' % result.modified_count) 
	new_document = await coll.find_one({'_id': _id}) 
	print('替换后是: %s' % pprint.pformat(new_document))

 loop = asyncio.get_event_loop()
 loop.run_until_complete(do_replace())
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
chenruhai
https://blog.csdn.net/qq_42658739 南宁

推荐标签 标签

  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 2 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    4 引用 • 55 回帖 • 10 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 89 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    15 引用 • 7 回帖 • 10 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1398 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 166 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 439 关注
  • 分享

    有什么新发现就分享给大家吧!

    242 引用 • 1748 回帖
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 181 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 221 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 20 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 295 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    396 引用 • 3416 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 693 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 2 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 511 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 623 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 906 回帖 • 193 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 592 关注
  • 安全

    安全永远都不是一个小问题。

    189 引用 • 813 回帖 • 1 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 251 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    131 引用 • 3639 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • 安装

    你若安好,便是晴天。

    128 引用 • 1184 回帖