PyMongo的简单使用

M-DAY 8年前
   <p style="text-align:center"><img src="https://simg.open-open.com/show/5c078bc0037be7090d7d35fa397ac793.png"></p>    <p><strong>写在前面:</strong></p>    <p>平常在处理数据的时候,必不可少地要使用数据库存取数据,出于一些原因,个人非常喜欢MongoDB这个数据库。但是在学习过程中发现,网上对PyMongo的中文说明文章很少,并且还有很大一部分是有误的,所以最好的学习办法还是通过官方文档(基本上都是这样吧)。</p>    <p>其中一部分内容为了方便使用对官方文档的顺序等做了一点改动,此教程可以给不熟悉的人作学习使用。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/9fbeee65752fd1768f96453a8e006fd7.jpg"> <img src="https://simg.open-open.com/show/56620ea5045537530cf803a9ded4adf9.png"></p>    <p>对PyMongo的简单说明:</p>    <p>PyMongo是Python中用来操作MongoDB的一个库。而MongoDB是一个基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案。其文件存储格式是类似于JSON的一种,叫BSON,通俗点理解,就是Python中的字典格式。</p>    <p>所以要利用Python操作MongoDB,有以下两个步骤:</p>    <p>1.在电脑上安装MongoDB;</p>    <p>2.在Python上装入PyMongo的库。</p>    <p>在使用Pymongo前,除了需要到安装Pymongo库以外,还需要到官网下载并安装MongoDB数据库到本地。</p>    <p>安装了MongoDB后,需要在cmd中配置数据库。在命令行中输入:</p>    <p>mongod --dbpath x:\MongoDB\data</p>    <p>(注:此处的路径表示你要创建数据库的文件夹,其中data文件夹需要自己在MongoDB路径下创建,系统不会在动帮你生成。)</p>    <p>以上步骤完成后可以在浏览器中输入如果看到信息"It looks like you are trying to access MongoDB over HTTP on the native driver port."说明已经成功,可以开始使用了。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b3974cab519eb29c33a254477988e7ac.png"></p>    <p><strong>(一)连接MongoClient</strong></p>    <p>使用pymongo的第一步首先是连接Client来使用服务:</p>    <pre>  <code class="language-python">from pymongo import MongoClient  Client = MongoClient()</code></pre>    <p><strong>(二)获取数据库(database)</strong></p>    <p>在MongoDB中一个实例能够支持多个独立的数据库,你可以用点取属性的方式来获取数据库,或者通过字典的方式获取:</p>    <pre>  <code class="language-python">db = Client.test_database  db = Client['test_database']</code></pre>    <p>(注:'test'可以换成你想要用的名字,比如"python_database")</p>    <p><strong>(三)获取Collection</strong></p>    <p>Collection是存储在MongoDB中的一组文件,同获取database一样,你可以用点取属性的方式或者字典的方法获取:</p>    <pre>  <code class="language-python">collection = db.test_collection  collection = db['test_collection']</code></pre>    <p><strong>(四)存储数据</strong></p>    <p>在MongoDB中,数据是以JSON的类型(即Python中的字典类型)存储的,在存储的时候支持调用Python的函数,因此其存储的数据准确地说是BSON类型。如下面的post:</p>    <pre>  <code class="language-python">import datetime  post = ['type':'BSON',             'date':datetime.datetime.utcnow()]</code></pre>    <p>了解完MongoDB的数据格式后,你可以通过以下的方式插入数据(其中.inserted_id将返回ObjectId对象):</p>    <pre>  <code class="language-python">document1 = ['x':1]  document2 = ['x':2]  posts = db.posts     #你也可以不这样做,每次通过db.posts调用  post_1 = posts.insert_one(document1).inserted_id  post_2 = posts.insert_one(document2).inserted_id</code></pre>    <p>每个插入的数据对应一个ObjectId,可直接查看:</p>    <pre>  <code class="language-python">>>>post_1  ObjectId(...)  >>>post_2  ObjectId(...)</code></pre>    <p>你还可以用insert_many()插入多个文档:</p>    <pre>  <code class="language-python">new_document = [{'x':3},                               {'x':4}]  result = posts.insert_many(new_document)    >>>result.inserted_ids  [ObjectId(...),ObjectId(...)]</code></pre>    <p><strong>(五)从MongoDB中调用数据</strong></p>    <p>find_one()函数能够从数据库中调出已存储的数据:</p>    <pre>  <code class="language-python">>>>posts.find_one()  ['x':'1']</code></pre>    <p>但用find_one()的方法只能获取一个数据,如果数据库中存在多个数据时,它返回的是第一个的值。你也可以通过ObjectId来请求数据,效果和上面是一样的。如果你想打印出全部数据,可以通过迭代的方式获取:</p>    <pre>  <code class="language-python">>>>for data in posts.find():              data  >>>  {u'x':1,  u'x':2,  u'x':3,  u'x':4}</code></pre>    <p>你也可以加入限制性因素来获取特定的数据:</p>    <pre>  <code class="language-python">>>> for post in posts.find({'x':1}):  >>>      post  >>>  {u'x':1}</code></pre>    <p>查找条件中也可以用正则匹配来匹配value。</p>    <p><strong>(六)更新数据</strong></p>    <p>在pymongo中可以用update_one()来更新数据:</p>    <pre>  <code class="language-python">>>>posts.update_one({'x':4},{'$set':{'x':3}})</code></pre>    <p>其中传入的第一个参数是你想要更新的数据,第二个是你想要更新的最新数据。其中$set部分是必要元素,如果没有会报出错误。除了$set外还有很多其它的比如$inc,对应着不同的功能,在此先不赘述。</p>    <p>上面只是更新匹配到的第一个数据,同样地,也可以用update_many()一次更新多个值。</p>    <p><strong>(七)删除数据</strong></p>    <p>同上,可以用delete_one()和delete_many()方法来删除数据,括号中是筛选条件:</p>    <pre>  <code class="language-python">>>>posts.delete_one({'x':3})  >>>posts.delete_one({'x':2})</code></pre>    <p><strong>(八)计数</strong></p>    <p>如果想知道collection中有多少文档,可以用.count()请求来获取符合条件的文档。</p>    <pre>  <code class="language-python">>>>posts.count()  4  >>>posts.find({'x':1})  1</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/a85d5cca6b493185fadbef30523663c8.png"></p>    <p> </p>    <p>来自:https://zhuanlan.zhihu.com/p/20500518</p>    <p> </p>