mongodb 监听不到端口_干货|MongoDB简单操作和通过python进行操作

点击上方“AI遇见机器学习”,选择“星标”公众号

重磅干货,第一时间送达

f3296d1c16bfe3505f384058448361fb.png

这次我们主要来简单的讨论一下在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 #指定使用哪个数据库的账号,这里用的是数据库admin
db_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=0
while 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=cursor
print aa == cursor
print gg == cursor
>True
False

若是想一次只查找一条信息,可以使用方法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》书籍推荐

f68a9c1e21189ce92500dd0f1a191d2b.png

欢迎关注我们,看通俗干货

4ea6c91fe18cbd7a8a77b6b74e82ac0d.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能+脑机接口:让我们距离“增强人类”越来越近

来源&#xff1a;资本实验室前段时间&#xff0c;一则新闻引发了广泛争议&#xff1a;国内一所小学利用头环来监控孩子的脑电波&#xff0c;以判断孩子上课是否走神。暂且不论该事件是否是一场打着高科技幌子的闹剧&#xff0c;头环本身所代表的脑机接口技术正在受到越来越多的…

哲学的未来

来源&#xff1a;哲学园作者&#xff1a;约翰R塞尔译者&#xff1a;GTY约翰塞尔生于1932年&#xff0c;当代著名哲学家&#xff0c;现为美国加州大学伯克利分校Slusser哲学教授&#xff0c;在语言哲学、心灵哲学和社会哲学领域贡献巨大&#xff0c;是目前在世的最著名的分析哲学…

怎么知道wx.config执行成功没_作为一个减肥40斤,且10年没反弹的普通人,这份瘦身经验分享给你...

“减肥”是女生老生常谈的话题&#xff0c;但是“减肥失败”、“越减越肥”也是很多女生面临的常态。所以做为成功减肥40斤且10多年没有反弹的人&#xff0c;我想来给大家一些自己的经验。很多姑娘知道减肥的关键因素是“热量差”&#xff0c;无论是增加运动&#xff0c;还是减…

html代码type,HTML中type是什么意思

在HTML中&#xff0c;type是类型的意思&#xff0c;是一个标签属性&#xff0c;主要用于定义标签元素的类型或文档(脚本)的MIME类型&#xff1b;例在input标签中type属性可以规定input元素的类型&#xff0c;在script标签中type属性可以规定脚本的MIME类型。推荐&#xff1a;ht…

bzoj1085骑士精神(搜索)

1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1893 Solved: 1051Description 在一个55的棋盘上有12个白色的骑士和12个黑色的骑士&#xff0c; 且有一个空位。在任何时候一个骑士都能按照骑士的走法&#xff08;它可以走到和它横坐标相差为1&am…

中国2项上榜:《时代周刊》2019年度100大最佳发明榜单发布!

来源&#xff1a;Time导读&#xff1a;《时代周刊》最新评选出2019年度100大最佳发明&#xff01;这100项突破性的发明改变了我们的生活、工作、娱乐和思考方式&#xff0c;它们让世界变得更美好&#xff0c;更智能&#xff0c;或更有趣。今天分享其中的20个极具未来感的产品。…

html异形轮播,异形滚动

异形滚动效果图.gif1、原理的揭示前言&#xff1a;图片大小处理问题的解决&#xff0c;当我们只改变盒子大小&#xff0c;图片会溢出&#xff0c;无法充满这个盒子。设置图片的宽高为 100%异形滚动.box {width: 100px;height: 100px;}img { //让图片充满整个盒子width: 100%;he…

【周末阅读】工业互联网的发展历程及实现路径

来源&#xff1a;青岛智能产业技术研究院【导读】目前&#xff0c;我国工业互联网发展迅猛&#xff0c;从国家层面、部委层面、地方层面都在积极推动&#xff0c;国际上对工业互联网发展也比较关注。我主要介绍工业互联网的三个方面内容&#xff1a;工业互联网的基本认识、国内…

三菱fx5u编程手册_FX5U系列PLC控制伺服3种方式

FX5U系列PLC为三菱目前最新的小型PLC&#xff0c;机身小巧却功能强大&#xff0c;不仅保留了三菱小型PLC已有的优点&#xff0c;还吸收了大型PLC的开发理念&#xff0c;在整体性能上得到了很大的提高。本文以FX5U在控制伺服的性能上做个总结&#xff0c;归纳下FX5U控制伺服的3种…

[转人工智能工程师学习路线及具备的5项基本技能

原文地址&#xff1a;http://blog.csdn.net/BaiHuaXiu123/article/details/52478853 摘要 学习路线 你是否对机器学习充满兴趣呢?其实到目前为止&#xff0c;每天有越来越多的工程师开始将好奇的目光转向机器学习领域。实际上&#xff0c;你会发现现在没有哪一个领域比机器学习…

python牛顿迭代公式_python计算牛顿迭代多项式实例分析

本文实例讲述了python计算牛顿迭代多项式的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;p evalPoly(a,xData,x). Evaluates Newtons polynomial p at x. The coefficient vector a can be computed by the function coeffts. a coeffts(xData,yData). Computes…

“机器人迟钝一点,会更有人情味”,迪士尼提出新型人机交互系统

来源&#xff1a;机器人大讲堂导读打篮球时&#xff0c;当球向你飞来&#xff0c;你总会下意识地或者说有意识地伸手去接住球。生活中&#xff0c;有人递给你一个东西时&#xff0c;你也会伸手去接住&#xff0c;礼貌或者仓促地。那么在如今拟人机器人越发“聪明”的时代&#…

华为十大发明

来源&#xff1a;蓝海长青智库时代的车轮滚滚向前&#xff0c;推动时代前进的离不开那些改变人们生活的发明。就像爱迪生发明电灯&#xff0c;每一个时代都有一些创新的技术足以载入史册。这些技术或许在发明初期还不足以让人感受到它的价值&#xff0c;但是随着时代的进步&…

基于类的命令行notebook的实现

在看一本书《PYTHON3 面向对象编程》 内容丰富&#xff0c;作作记录。 notebook.py __author__ chengang882import datetime# Store the next available id for all new note last_id 0class Note(object):"""Represent a note in the notebook. Match agains…

2020年五大云计算预测

来源&#xff1a;信息安全与通信保密杂志社Forrester的新报告发现&#xff0c;超大规模云联盟、云原生创新和新的云安全要求将在2020年重塑云计算行业格局。Forrester近日发布了一份报告&#xff0c;对2020年的云计算行业发布了五大预测。这些预测表明争夺云计算霸主地位的竞争…

薛建儒:无人车的场景理解与自主运动

来源&#xff1a;人工智能前沿讲习一报告导读本文为西安交通大学人工智能与机器人研究所薛建儒教授&#xff0c;做的题为无人车场景计算与自主运动的研究进展的报告&#xff0c;主要从无人车概述、场景理解、自主运动、总结与展望四个方面介绍了其团队在无人驾驶领域的探索。在…

(转)HTTP 长连接和短连接

1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议&#xff0c;在传输层使用TCP协议&#xff0c;在网络层使用IP协议。IP协议主要解决网络路由和寻址问题&#xff0c;TCP协议主要解决如何在IP层之上可靠的传递数据包&#xff…

中美科技成果转化比较分析

来源&#xff1a;创新研究近年来随着国家在不断加大科技投入&#xff0c;以及专利成果数量的快速增长&#xff0c;全社会对科技创新关注程度不断提高&#xff0c;对我国科技成果转化率低的批评不断增加&#xff0c;有文章指出“我国科技成果的转化率仅有10%&#xff0c;比美国8…

商用计算机低温工作,突破量子计算机瓶颈!超低温芯片能在接近绝对零度的温度下工作...

如何克服量子计算机运转时产生的超高热量仍是量子计算机研究当中的一大难题。日前&#xff0c;科学家开发出一种新型的低温计算机芯片&#xff0c;能够在接近绝对零度的理论温度极限下工作。这种名为 Gooseberry 的低温系统为量子计算领域的革命奠定了基础——使新一代机器能够…

python自动化测试开发_基于python的selenium2自动化测试从基础到实战(Python3、selenium2、自动化测试、web测试)...

Selenium2是目前比较流行的一款针对web页面测试的自动化测试工具&#xff0c;他的前身是Selenium 。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite等。但是目前使用Selenium2做测试的基本是采用ja…