mongodb 监听不到端口_干货|MongoDB简单操作和通过python进行操作
点击上方“AI遇见机器学习”,选择“星标”公众号
重磅干货,第一时间送达
这次我们主要来简单的讨论一下在MongoDB中如何更新数据(修改数据),删除数据,以及如何通过Python调用MongoDB。
一、简单使用MongoDB操作数据
| a.更新数据
| i.数据更新
更新集合中的数据使用update(CONDITION,OPERATE)
命令,它接收两个参数,前者为条件,后者为进行更新的操作:
> db.asd.insert({x:1})WriteResult({ "nInserted" : 1 })> db.asd.find(){ "_id" : ObjectId("5961087fd4fd4ce8ff6ca18a"), "x" : 1 }> db.asd.update({x:1},{x:2})WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.asd.find(){ "_id" : ObjectId("5961087fd4fd4ce8ff6ca18a"), "x" : 2 }
如上例,将文档中有x:1
的改成x:2
。
| ii.局部更新
有些时候,我们需要对文档进行局部更新,MongoDB中,默认一般情况的修改会对整个文档造成影响
> db.asd.insert({x:1,y:1,z:1})WriteResult({ "nInserted" : 1 })> db.asd.update({x:1},{y:2})WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.asd.find(){ "_id" : ObjectId("59610918d4fd4ce8ff6ca18b"), "y" : 2 }
例如上面的例子,我们只想对{x:1,y:1,z:1}
进行修改使得y:1
变为y:2
,但如果直接使用update()
会使得整个文档被修改的只剩下y:1
。
这个时候,就需要使用$set
来对文档进行局部更新
> db.asd.update({x:1},{$set:{y:2}})WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.asd.find(){ "_id" : ObjectId("596109e0d4fd4ce8ff6ca18c"), "x" : 1, "y" : 2, "z" : 1 }
| iii.更新不存在的数据
有时候,我们需要直接更新一条数据库中并不存在的数据,这个时候,仅仅用原来的update()
的使用方法是达不到效果的,我们需要在括号里面加上第三个参数(Bool)来实现我们想要的效果
> db.zyzy.find()> db.zyzy.update({x:1},{y:1},true)WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("5961b6f09f1fbf45940b7f04")})> db.zyzy.find(){ "_id" : ObjectId("5961b6f09f1fbf45940b7f04"), "y" : 1 }
| iv.更新多条数据
update
在使用的时候,默认只更新被查找到的第一条数据,这是为了防止用户进行误操作。
> for(i=0;i<3;i++)db.zyzy.insert({x:1})WriteResult({ "nInserted" : 1 })#插入三条x为1的文档> db.zyzy.update({x:1},{x:2})WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.zyzy.find(){ "_id" : ObjectId("5961b7fe540435d89b5c5eca"), "x" : 2 }{ "_id" : ObjectId("5961b7fe540435d89b5c5ecb"), "x" : 1 }{ "_id" : ObjectId("5961b7fe540435d89b5c5ecc"), "x" : 1 }
发现只有第一个文档被更新了。
要同时更新多条数据,就需要使用update()
的第四个也是最后一个参数(Bool)。
> db.zyzy.update({x:1},{$set:{x:2}},false,true)WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })> db.zyzy.find(){ "_id" : ObjectId("5961b7fe540435d89b5c5eca"), "x" : 2 }{ "_id" : ObjectId("5961b7fe540435d89b5c5ecb"), "x" : 2 }{ "_id" : ObjectId("5961b7fe540435d89b5c5ecc"), "x" : 2 }
这里的更新方式通常都是使用局部更新的方式,也是为了防止误操作。
| b.数据删除
要删除集合中的数据,我们使用remove()
方法,它接收一个参数,作为查找删除数据的条件,该参数不能为空。如果想清除集合里面的所有数据,可以直接时候用drop()
废除集合。
> db.test_collection.find(){ "_id" : ObjectId("5961b9d8540435d89b5c5ecd"), "x" : 1 }{ "_id" : ObjectId("5961b9e9540435d89b5c5ece"), "x" : 1 }{ "_id" : ObjectId("5961b9e9540435d89b5c5ecf"), "x" : 1 }{ "_id" : ObjectId("5961b9e9540435d89b5c5ed0"), "x" : 1 }> db.test_collection.remove({x:1})WriteResult({ "nRemoved" : 4 })> db.test_collection.find()
但也有时候我们只想删除被找到的第一条数据,这个时候可以利用remove
的第二个参数
> for(i=0;i<10;i++)db.test_collection.insert({x:i})WriteResult({ "nInserted" : 1 })> db.test_collection.remove({x:{$type:1}},true)WriteResult({ "nRemoved" : 1 })> db.test_collection.find(){ "_id" : ObjectId("5961e9c7e12ea99cbdc056a4"), "x" : 1 }{ "_id" : ObjectId("5961e9c7e12ea99cbdc056a5"), "x" : 2 }{ "_id" : ObjectId("5961e9c7e12ea99cbdc056a6"), "x" : 3 }{ "_id" : ObjectId("5961e9c7e12ea99cbdc056a7"), "x" : 4 }...
二、安装pymongo与连接MongoDB
接下来我们介绍如何在Python中使用MongoDB。
要通过Pyhton使用MongoDB,我们首先需要下载Python用于操作MongoDB的库pymongo
pip install pymongo
然后就可以在python中导入这个库了,不过通常我们只是导入它的驱动:
from pymongo import MongoClien
导入之后,我们在Python中通过下面一段代码获取MongoDB的操作对象:
client=MongoClient('127.0.0.1',27017) #建立和数据库的连接,前者是MongoDB服务所在的地址,后者是对应的端口号db_auth=client.admin #指定使用哪个数据库的账号,这里用的是数据库admindb_auth.authenticate("admin","password") #权限认证,第一个参数是账号,第二个参数是密码#若连接的数据库不需要账号,上述两条可以省略。db_name="test" #要连接的数据库的名字db = client[db_name] #获得数据库操作对象,也可以写作`client.db_name`collection_useraction=db['useraction'] #获得数据库的集合操作对象,集合名为“useraction”
获得集合操作对象之后,我们就可以通过这个集合操作对象对数据库的集合进行操作,以上例为例,就是对名为MongoDB的数据库“test”中名为“useraction”的集合进行操作。
三、在Python中操作MongoDB
| a.插入数据
往集合插入数据的方法有两种,分别是insert()
和save()
,对应的就是MongoDB Shell里面的insert()
和save()
。
它们之间的区别就是,insert()
在插入和原来信息重复的数据对象的时候,会报错,而save()
则会将原来的数据对象进行更新。当然,这里的重复指的是唯一索引的重复,类似于“_id”的重复。
collection_useraction.insert({"x":1}
用shell查看,发现插入成功
> db.useraction.find(){ "_id" : ObjectId("59635e3a867e573b0c7c8d71"), "x" : 1 }
collection_useraction.insert({"x":1,"_id":1})>...pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection: test.useraction index: _id_ dup key: { : 1 }#在已有"_id"为1的数据的时候插入一条上述数据,发现编译器报错
在python中的insertMany()
方法语法为insert_many()
可以发现,python中对MongoDB插入数据的方式与MongoDB Shell没有太多区别。
| b.更新数据
更新数据使用update()
方法,语法格式如下:
update(criteria, objNew, upsert, mult)
criteria: 需要被更新的条件表达式
objNew: 更新表达式
upsert: 如目标记录不存在,是否插入新文档。
multi: 是否更新多个文档。
示例:
collection_useraction.update({"x":{"$lt":2}},{"$set":{"y":2}},upsert=True
发现操作符的使用方式也与shell没有太多区别。
| c.删除数据
| i.删除集合
要删除一个集合,有多种方法,方法一是用:
db.collection_name.drop()
这个地方的collection_name
指的是这个集合在MongoDB数据库里面的名字,例如我们上面的例子,它的名字就是“useraction”,而不是“collection_useraction”。
另外一个方法是用:
collection_operator.drop()
collection_operator
指的就是python中该集合的操作对象,如上例,就是“collection_useraction”,而不是集合名字“useraction”
| ii.删除文档
删除文档使用remove()
方法,同样有两种方式调用,与上文中删除集合类似,所以这里只讲一种方法:
collection_operator.remove(self, spec_or_id=None, multi=True, **kwargs)
第一个参数表示要删除的文档的搜索条件或者该文档的id,默认为None。
multi表示是否删除多个,为False的时候一次只删除一个。
当括号为空的时候会删除集合内所有文档,这一点与shell不同。
collection_useraction.remove({"x":1})
表示删除所有集合中“x”值为1的文档。| d.查找数据
| i.find与cursor
我们先假设我们在集合中插入了100条信息
i=0while i<100: collection_useraction.insert({"x":i,"y":100-i}) i+=1
在Python中查找用的方法同样也是find()
,使用方式也与shell相同,当我们需要查找并遍历查找结果的时候,可以用这样的方式:
for u in collection_useraction.find({"x":{"$exists":True}}): print u>{u'y': 100, u'x': 0, u'_id': ObjectId('59636678867e5717981f18c1')}{u'y': 99, u'x': 1, u'_id': ObjectId('59636678867e5717981f18c2')}{u'y': 98, u'x': 2, u'_id': ObjectId('59636678867e5717981f18c3')}...
这是因为语句collection_useraction.find({"x":{"$exists":True}})
返回了一个可供迭代的对象,用type()
方法可以看到这个对象的类型:
cursor=collection_useraction.find({"x":{"$exists":True}})print type(cursor)>
这个对象同时还支持我们直接用索引访问:
print cursor[10]>{u'y': 90, u'x': 10, u'_id': ObjectId('59636678867e5717981f18cb')}
并且还支持一些shell的方法:
print cursor.explain()>{u'executionStats': {u'executionTimeMillis': 0, u'nReturned': 100, u'totalKeysExamined': 0, u'allPlansExecution': [], u'executionSuccess': True, u'executionStages': {u'needYield': 0, u'direction': u'forward', u'saveState': 0, u'restoreState': 0, u'isEOF': 1, u'docsExamined': 100, u'nReturned': 100, u'needTime': 1, u'filter': {u'x': {u'$exists': True}}, u'executionTimeMillisEstimate': 0, u'invalidates': 0, u'works': 102, u'advanced': 100, u'stage': u'COLLSCAN'}, u'totalDocsExamined': 100}, u'queryPlanner': {u'parsedQuery': {u'x': {u'$exists': True}}, u'rejectedPlans': [], u'namespace': u'test.useraction', u'winningPlan': {u'filter': {u'x': {u'$exists': True}}, u'direction': u'forward', u'stage': u'COLLSCAN'}, u'indexFilterSet': False, u'plannerVersion': 1}, u'ok': 1.0, u'serverInfo': {u'host': u'iPhone', u'version': u'3.4.6', u'port': 27017, u'gitVersion': u'c55eb86ef46ee7aede3b1e2a5d184a7df4bfb5b5'}}
并且可以对它进行深拷贝:
gg=cursor.clone()aa=cursorprint aa == cursorprint gg == cursor>TrueFalse
若是想一次只查找一条信息,可以使用方法find_one()
。
| ii.查询特定键
当我们只想查询指定的关键字的值的时候,就需要用到find()
的第二个参数“projection”:
cursor=collection_useraction.find({},{"x":1})print cursor[10]>{u'x': 10, u'_id': ObjectId('59636678867e5717981f18cb')}cursor=collection_useraction.find({},projection={"x":1})print cursor[10]>{u'x': 10, u'_id': ObjectId('59636678867e5717981f18cb')}
| iii.排序
排序用的同样是方法sort()
,但是使用方式与shell略有不同:
useraction.find().sort([("KEY",)])
“KEY”指作为排序基准的关键字的名字,则表示排序的方法,有两个选项,分别是pymongo.ASCENDING
(升序,可用1代替)和pymongo.DESCENDING
(降序,可用-1代替)对象,示例:
for u in collection_useraction.find().sort([("x",pymongo.DESCENDING)]): print u>{u'y': 1, u'x': 99, u'_id': ObjectId('59636679867e5717981f1924')}{u'y': 2, u'x': 98, u'_id': ObjectId('59636679867e5717981f1923')}{u'y': 3, u'x': 97, u'_id': ObjectId('59636679867e5717981f1922')}{u'y': 4, u'x': 96, u'_id': ObjectId('59636679867e5717981f1921')}...
也可以直接使用find()
方法中的sort
参数:
for u in collection_useraction.find(sort=[("x",pymongo.DESCENDING)]): print u
| iv.切片
在shell中我们使用skip()
与limit()
方法来对查询结果进行切片,python中一样可以:
for u in collection_useraction.find().skip(90).limit(3): print u>{u'y': 10, u'x': 90, u'_id': ObjectId('59636679867e5717981f191b')}{u'y': 9, u'x': 91, u'_id': ObjectId('59636679867e5717981f191c')}{u'y': 8, u'x': 92, u'_id': ObjectId('59636679867e5717981f191d')}
skip与limit同样支持参数写法。
不仅如此,我们还可以对查询结果使用索引切片:
for u in collection_useraction.find()[2:5]: print u>{u'y': 98, u'x': 2, u'_id': ObjectId('59636678867e5717981f18c3')}{u'y': 97, u'x': 3, u'_id': ObjectId('59636678867e5717981f18c4')}{u'y': 96, u'x': 4, u'_id': ObjectId('59636678867e5717981f18c5')}
| v.正则查询
在查询文本的时候,除了MongoDB原有的文本查询格式,我们还可以使用正则表达式:
pattern=re.compile(r"aa*")for u in collection_useraction.find({"x":pattern}): print u>{u'x': u'aa bb cc dd', u'_id': ObjectId('596377bd687384c0a1b9d5e9')}#下面这个查询方式显然shell中也是支持的for u in collection_useraction.find({"x":{"$regex":r"aa b{2} c{1,3} dd"}}): print u>{u'x': u'aa bb cc dd', u'_id': ObjectId('596377bd687384c0a1b9d5e9')}
推荐阅读
干货|学术论文怎么写
资源|NLP书籍及课程推荐(附资料下载)
干货|全面理解N-Gram语言模型
资源|《Machine Learning for OpenCV》书籍推荐
欢迎关注我们,看通俗干货!
mongodb 监听不到端口_干货|MongoDB简单操作和通过python进行操作相关推荐
- Golang net/http包 同时监听多个端口
背景 在golang中 需要同时监听多个端口 对http请求进行相同的处理(handler) 实现 代码如下 很简单 func handler1(w http.ResponseWriter, r *h ...
- TCP和UDP可以同时监听相同的端口
TCP和UDP可以同时监听相同的端口吗(可以) IP数据包首部有个叫做协议的字段,指出了上层协议是TCP还是UDP还是其他.操作系统有能力根据接受的报文的IP字段里面的协议部分判断这个报文是什么报文, ...
- 本地启动 Hybris 服务器调试模式后,监听在 8000 端口
使用命令行 hybrisserver.bat debug 启动后,在任务管理器查看 Java.exe 进程: 能看到监听在 8000端口,启用的命令行参数如下: "C:\Program Fi ...
- java 监听本地端口_JAVA本地监听与远程端口扫描
摘 要 随着Internet的不断发展,信息技术已成为社会进步的巨大推动力.不管是存储于服务器里还是流通于Internet上的信息都已成为一个关系事业成败的关键,这就使保证信息的安全变得格外重要.本地 ...
- nginx 监听非标准端口80,重定向端口丢失问题解决
nginx 监听非标准端口80,重定向端口丢失问题解决 参考文章: (1)nginx 监听非标准端口80,重定向端口丢失问题解决 (2)https://www.cnblogs.com/qianxunm ...
- 如何判断目标主机是否在监听一个UDP端口(阿里云二面)
面试官:我问一个简单的问题,如何判断目标主机是否在监听一个UDP端口port? 我:给目标主机发送一个UDP报文(含目标port),如果收到回复,表示监听,否则表示没有监听. 面试官:有没有通用一点的 ...
- php进程监听是什么意思,多进程监听同个端口及单进程监听多个端口的php版本实现...
最近在看nginx设计原理时思考到两个问题,便是: 多个进程能否监听同个端口? 单个进程能否监听多个端口? 当然随着学习的深入,答案均是肯定的,在这个过程中笔者为了验证,用php写了两个例子,在这里分 ...
- 单个进程监听多个端口及多个进程监听同一个端口
单个进程监听多个端口 单个进程创建多个 socket 绑定不同的端口,TCP, UDP 都行 多个进程监听同一个端口(multiple processes listen on same port) 方 ...
- mongodb监听oplog 全量+增量同步
一.前言 前一个项目中,涉及到了一次数据迁移,这次迁移需要从mongodb迁移到另一个mongodb实例上,两个源的数据结构是不一样的.涉及到增量和全量数据迁移,整体迁移数据量在5亿左右.本篇即讲理论 ...
最新文章
- 转载:赶集网部门老大回应热帖《我在赶集网的两个月》
- pinpoint 安装部署
- 【MM】需求类型清单
- Java 线程池相关问题
- android 开源项目列表【持续整理中。。。】
- python真的是吹过了-被吹的神乎其神的Python到底都能干什么
- 4775电子书免费链接
- 常用运放做跟随器使用总结
- Datawhale组队学习NLP之transformer Task03 BERT
- 关于串口通信SBUF寄存器随笔:
- java 删除指定文件夹内所有文件
- 为 Nexus 5 准备的 Sailfish 移植版本
- 2021年9月Github优秀项目推荐
- sqlmap问题及解决办法
- 第四章:Android灯光系统(2)-led_class驱动
- 中国古代天干地支纪年法
- CRC校验matlab源码
- SER-U ftp服务器的配置
- Excel操作 Microsoft.Office.Interop.Excel.dll的使用
- 天天福利抽奖-JAVA概率抽奖
热门文章
- flask框架+mysql数据库并与前台数据交互
- linux视频在windows播放器,适用于Windows和Linux的免费多媒体播放器SMPlayer 18.6.0发布 - 爱绿豆...
- vue开发手机页面闪烁_Vue页面加载闪烁问题的解决方法_婳祎_前端开发者
- 真正的高阶特征交叉:xDeepFM与DCN-V2
- 你确定自己不是那只猫吗
- 进阶阿里架构师:算法、编程语言、数据库、架构设计!书单推荐!
- 论文浅尝 | 一种嵌入效率极高的 node embedding 方式
- 解决安装IIS时提示找不到zClientm.exe文件的问题
- 消息队列---消息模型及使用场景
- VM虚拟机下配置centos linux系统