花尽千霜默 發表於 2019-6-7 16:41:00

MongoDB 数据库 — Python 连接

<h1 id="1-mongodb-简介">1 MongoDB 简介</h1>
<p>MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。</p>
<p>MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。</p>
<p><strong>MongoDB 中的递归关系</strong>:</p>
<ul>
<li>MongoDB的一个实例可以拥有多个相互独立的数据库(database),每个数据库都拥有自己的集合;</li>
<li>集合(collection)可以看作是一个拥有动态模式(dynamic schema)的表;</li>
<li>文档是 MongoDB 中数据的基本单元,相当于关系型数据库中的行;</li>
<li>每一个文档都有一个特殊的键 "_id",这个键在文档所属的集合中是唯一的。</li>
</ul>
<blockquote>
<p>文档中的键/值对是有序的:{“x”:1, “y”:2} 与 {“y”:2, “x”:1} 是不同的。</p>
</blockquote>
<p><img src="https://img2018.cnblogs.com/blog/840488/201906/840488-20190605201057956-928206847.png" alt="" loading="lazy"></p>
<p>通过下图实例,我们也可以更直观的理解 Mongo 中的一些概念:</p>
<p><img src="https://img2018.cnblogs.com/blog/840488/201906/840488-20190605201142678-918135642.png" alt="" loading="lazy"></p>
<h1 id="2-python-连接-mongodb">2 Python 连接 MongoDB</h1>
<p>工作中主要是在阿里云服务器的 MongoDB 查询窗口中进行查询,有时候也会利用 Python 连接 MongoDB 查询。</p>
<p>Python 连接阿里云 MongoDB,首先需要安装 Python 模块 pymongo,然后依据如下操作:</p>
<pre><code class="language-python">from pymongo import MongoClient

client = MongoClient('mongodb://username:password@localhost:port/database')
db = client.database# 这里为什么还要再加一次数据库名称?

# 或者
client = MongoClient('mongodb://localhost:port/database', username='username', password='password')
</code></pre>
<h1 id="3-mongo-日期类型">3 Mongo 日期类型</h1>
<p>在 Mongo 中可以看到时间的存储类型为 ISODate,比如 <span style="color: rgba(255, 0, 0, 1)">"reqTime": "ISODate("2018-07-11T02:12:49.109Z")" </span>。这是由于 Mongo 中的时间以 UTC(Coordinated Universal Time)类型存储,就等于 GMT(格林尼治标准时)时间。而我们当前所处的是 +8 区(北京时间),所以 Mongo 会将当前时间减去 8,然后存储成 GMT 时间。</p>
<h2 id="31-mongo-shell-日期类型">3.1 Mongo shell 日期类型</h2>
<h3 id="311-new-date-和-date-比较">3.1.1 new Date() 和 Date() 比较</h3>
<pre><code class="language-python"># new Date() 返回当前的 Date 日期对象,mongo shell 使用 ISODate 来包装 Date 对象
db.test.insert( { mark: 1, mark_time: new Date() } )
# Date() 返回当前日期的字符串形式
db.test.insert( { mark: 2, mark_time: Date() } )
db.test.find()

# 返回结果
{ "_id" : ObjectId("5126e00939899c4cf3805f9b"), "mark" : 1, "mark_time" : ISODate("2019-06-05T03:03:37.312Z") }
{ "_id" : ObjectId("5126e00c39899c4cf3805f9c"), "mark" : 2, "mark_time" : "Wed Jun 05 2019 11:03:40 GMT+0800" }
</code></pre>
<p>我们可以传递给 <strong>new Date()</strong> 构建器或者 <strong>ISODate()</strong> 函数,这些函数接受下面的格式:</p>
<ul>
<li><strong>new Date("YYYY-mm-dd")</strong> 返回 <strong>ISODate</strong> 指定的 date</li>
<li><strong>new Date("YYYY-mm-ddTHH:MM:ss")</strong> 指定客户端当前时区的 datetime,并且返回 UTC 中 <strong>ISODate</strong> 指定的 datetime</li>
<li><strong>new Date("YYYY-mm-ddTHH:MM:ssZ")</strong> 指定 UTC 中的 datetime,并且返回 UTC 中 <strong>ISODate</strong> 指定的 datetime</li>
<li><strong>new Date(integer)</strong> 指定自 Unix epoch (Jan 1,1970) 以来的 datetime 为 milliseconds,并且返回<strong>ISODate</strong> 实例</li>
</ul>
<h3 id="312-在阿里云-mongodb-查询窗口运行实例">3.1.2 在阿里云 MongoDB 查询窗口运行实例</h3>
<p><strong>实例 1</strong></p>
<pre><code>db.arcVerify.aggregate([   
    {'$match': {'addTime': {'$gte': new Date("2019-06-05T00:00:00") } }
    },   
   
    {'$match': {'sceneNo': '800'}
    }
])
</code></pre>
<p><img src="https://img2018.cnblogs.com/blog/840488/201906/840488-20190605220717921-996839830.png" alt="" loading="lazy"></p>
<p><strong>实例 2</strong></p>
<pre><code>db.arcVerify.aggregate([   
    {'$match': {'addTime': {'$gte': new Date("2019-06-05 00:00:00") } }
    },   
   
    {'$match': {'sceneNo': '800'}
    }
])
</code></pre>
<p><img src="https://img2018.cnblogs.com/blog/840488/201906/840488-20190605222550109-828420757.png" alt="" loading="lazy"></p>
<p><strong>实例 3</strong></p>
<pre><code>db.arcVerify.aggregate([   
    {'$match': {'addTime': {'$gte': new Date("06/05/2019") } }
    },
   
    {'$match': {'sceneNo': '800'}
    }
])
</code></pre>
<p><img src="https://img2018.cnblogs.com/blog/840488/201906/840488-20190610153038767-317295267.png" alt="" loading="lazy"></p>
<p><strong>实例 4</strong></p>
<pre><code>db.arcVerify.aggregate([   
    {'$match': {'addTime': {'$gte': new Date("2019-06-05") } }
    },   
   
    {'$match': {'sceneNo': '800'}
    }
])
</code></pre>
<p><img src="https://img2018.cnblogs.com/blog/840488/201906/840488-20190605222810587-1930124251.png" alt="" loading="lazy"></p>
<p><strong>实例 5</strong></p>
<pre><code>db.arcVerify.aggregate([   
    {'$match': {'addTime': {'$gte': new Date("2019-06-05T00:00:00Z") } }
    },   
   
    {'$match': {'sceneNo': '800'}
    }
])
</code></pre>
<p><img src="https://img2018.cnblogs.com/blog/840488/201906/840488-20190605221108884-1495270054.png" alt="" loading="lazy"></p>
<p><strong>实例 6</strong></p>
<pre><code>db.arcVerify.aggregate([   
    {'$match': {'addTime': {'$gte': ISODate("2019-06-04T16:00:00.000Z")} }
    },
   
    {'$match': {'sceneNo': '800'}
    }
])
</code></pre>
<p><img src="https://img2018.cnblogs.com/blog/840488/201906/840488-20190605221329173-1107668475.png" alt="" loading="lazy"></p>
<p><strong>实例 7</strong></p>
<pre><code># 图中显示时间为当前运行时间
db.arcVerify.aggregate([   
    {'$match': {'addTime': {'$gte': Date("2019-06-05 00:00:00.00")} }
    },
   
    {'$match': {'sceneNo': '800'}
    }
])
</code></pre>
<p><img src="https://img2018.cnblogs.com/blog/840488/201906/840488-20190605221755350-79341102.png" alt="" loading="lazy"></p>
<h2 id="32-python-查询日期">3.2 Python 查询日期</h2>
<h3 id="321-python-日期类型">3.2.1 Python 日期类型</h3>
<p>pyMongo使用 <strong>datetime.datetime</strong> 对象来表示 MongoDB documents(文档) 中 dates 和 times。因为 MongoDB 假定 dates 和 times 是 UTC 形式的,所以我们要确保被写进数据库的时间可以反映 UTC。例如,下面的代码在 MongoDB 中存储当前 UTC date 和 time:</p>
<pre><code>result = db.objects.insert_one( { "last_modified": datetime.datetime.utcnow() } )
</code></pre>
<p>使用 datetime.datetime.utcnow() 可以返回 UTC 中的 current time,而 datetime.datetime.now() 返回 current local time。避免如下操作:</p>
<pre><code>result = db.objects.insert_one( { "last_modified": datetime.datetime.now() } )
</code></pre>
<p>在上面两个例子中,虽然两个文档都在同样的 local time 被存储,但是 last_modified 值是非常不同的。这可能对于读取它们的应用来说会有些混乱:</p>
<pre><code class="language-python"> for doc in db.objects.find()]

# 结果
[datetime.datetime(2019, 6, 7, 4, 23, 41, 582944),
datetime.datetime(2019, 6, 7, 12, 23, 42, 727949)]
</code></pre>
<h3 id="322-实例">3.2.2 实例</h3>
<p>查找 2019-06-06 日的数据</p>
<pre><code class="language-python">from datetime import datetime

date = '2019-06-06'
intdate =
date1 = datetime(intdate, intdate, intdate) - timedelta(hours=8)
date2 = datetime(intdate, intdate, intdate) + timedelta(hours=16)

db.arcSceneRuleDetail.aggregate([
      {'$match':
            {'addTime': {"$gte": date1,
                         "$lt": date2}
            }
      },
      ...
])

# 或者
db.arcSceneRuleDetail.aggregate([
      {'$match':
            {'addTime': {"$gte": datetime(2019, 6, 5, 16, 0),
                         "$lt": datetime(2019, 6, 6, 16, 0)}
            }
      },
      ...
])
</code></pre>
<h1 id="参考资料">参考资料</h1>
<ol>
<li>
<p>MongoDB 概念解析</p>
</li>
<li>
<p>Mongo日期类型</p>
</li>
<li>
<p>mongoDB 文档 Date()</p>
</li>
<li>
<p>PyMongo 3.8.0 documentation 中 Datetimes and Timezones</p>
</li>
</ol><br><br>
来源:https://www.cnblogs.com/shaocf/p/10953894.html
頁: [1]
查看完整版本: MongoDB 数据库 — Python 连接