mongodb-API
<h2 class="md-end-block md-heading"><span class="md-plain md-expand">mongodb-API</span></h2><h3 class="md-end-block md-heading"><span class="md-plain">连接mongo(该操作一般在初始化时就执行)</span></h3>
<p class="md-end-block md-p"><span class="md-plain">出现 由于目标计算机积极拒绝,无法连接的错误时</span></p>
<ol class="ol-list" start="">
<li class="md-list-item md-focus-container">
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">查看是否进行虚拟机的端口转发</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">将 /etc/ 目录下的mongodb.conf 文件 bind_ip修改为 0.0.0.0, 表示任何主机都可以访问</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">重启服务 service mongodb restart</span></p>
</li>
</ol>
<pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm"> <span><span class="cm-keyword">import <span class="cm-variable">pymongo<br> <span><span><br> <span><span class="cm-comment"># 1.连接mongodb<br> <span><span class="cm-variable">client = <span class="cm-variable">pymongo.<span class="cm-property">MongoClient(<span class="cm-variable">host=<span class="cm-string">'127.0.0.1', <span class="cm-variable">port=<span class="cm-number">27017)<br> <span class="cm-tab-wrap-hack"><span class="cm-comment"># client = pymongo.MongoClient('mongodb://127.0.0.1:27017/')<span class="cm-tab"> # 另一种连接方式<br> <span><span><br> <span><span class="cm-comment"># 2.指定数据库(没有会自动创建)<br> <span><span class="cm-variable">db = <span class="cm-variable">client[<span class="cm-string">'db_spider']<br> <span><span><br> <span><span class="cm-comment"># 3.指定集合(没有就自动创建)<br> <span><span class="cm-variable">collection = <span class="cm-variable">db[<span class="cm-string">'student']<span class="cm-tab"><span class="cm-comment"># 这样就声明了一个Collection对象<br> <span><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"> </p>
<h3 class="md-end-block md-heading"><span class="md-plain">插入数据</span></h3>
<pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded"> <span><span class="cm-comment"># 4.插入数据<br> <span><span class="cm-variable">官方推荐使用insert_one()<span class="cm-variable">插入单条数据, <span class="cm-variable">insert_many()<span class="cm-variable">插入多条文档<br> <span><span class="cm-variable">data = {<br> <span> <span class="cm-string">'name': <span class="cm-string">'夜阑', <br> <span> <span class="cm-string">'sex': <span class="cm-string">'男',<br> <span> <span class="cm-string">'年龄': <span class="cm-number">20<br> <span>}<br> <span><span><br> <span><span class="cm-variable">res = <span class="cm-variable">collection.<span class="cm-property">insert_one(<span class="cm-variable">data)<br> <span><span class="cm-builtin">print(<span class="cm-variable">res)<span class="cm-tab"><span class="cm-tab"> <span class="cm-tab"> <span class="cm-tab"> <span class="cm-tab"> <span class="cm-comment"># 返回InsertOneResult 对象<br> <span><span class="cm-builtin">print(<span class="cm-variable">res.<span class="cm-property">inserted_id)<span class="cm-tab"><span class="cm-tab"> <span class="cm-comment"># 调用其inserted_id属性获取_id(每条数据都有一个id属性来唯一标识)<br> <span><span><br> <span><span class="cm-variable">data2 = {<br> <span> <span class="cm-string">'name': <span class="cm-string">'丹丹', <br> <span> <span class="cm-string">'sex': <span class="cm-string">'女',<br> <span> <span class="cm-string">'年龄': <span class="cm-number">18<br> <span>}<br> <span><span class="cm-variable">collection.<span class="cm-property">insert_many([<span class="cm-variable">data, <span class="cm-variable">data2])<span class="cm-tab"> <span class="cm-comment"># 多条数据以列表的形式传递<br> <span><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"> </p>
<h3 class="md-end-block md-heading"><span class="md-plain">查询</span></h3>
<h5 class="md-end-block md-heading"><span class="md-plain">基本使用</span></h5>
<pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded"> <span><span class="cm-keyword">from <span class="cm-variable">pprint <span class="cm-keyword">import <span class="cm-variable">pprint<br> <span><span><br> <span><span class="cm-comment"># 查询一条;可指定条件(是一个字典)<br> <span><span class="cm-variable">result = <span class="cm-variable">collection.<span class="cm-property">find_one()<br> <span><span><br> <span><span class="cm-comment"># 查看集合中的全部文档 <br> <span><span class="cm-variable">result1 = <span class="cm-variable">collection.<span class="cm-property">find()<span class="cm-tab"> <span class="cm-tab"> <span class="cm-comment"># 返回Cursor类型,相当于一个生成器<br> <span><span class="cm-variable">pprint(<span class="cm-builtin">list(<span class="cm-variable">result1))<br> <span><span class="cm-keyword">for <span class="cm-variable">i <span class="cm-keyword">in <span class="cm-variable">result1: <span class="cm-tab"><span class="cm-tab"> <span class="cm-tab"> <span class="cm-comment"># 将该对象通过for遍历<br> <span> <span class="cm-builtin">print(<span class="cm-variable">i)<br> <span><span><br> <span><span class="cm-comment"># 当然我们也可以通过过ObjectId来查询,使用bson库里面的objectid:<br> <span><span class="cm-keyword">from <span class="cm-variable">bson.<span class="cm-property">objectid <span class="cm-keyword">import <span class="cm-variable">ObjectId<br> <span><span class="cm-variable">res = <span class="cm-variable">collection.<span class="cm-property">find_one({<span class="cm-string">'_id': <span class="cm-variable">ObjectId(<span class="cm-string">'5d1b2df85a11e06dab918ec7')})<br> <span><span><br> <span><span class="cm-comment"># 条件查询<br> <span class="cm-tab-wrap-hack"><span class="cm-variable">collection.<span class="cm-property">find({<span class="cm-string">'name': <span class="cm-string">'yelan'})<span class="cm-tab"><br> <span><span class="cm-variable">resu = <span class="cm-variable">collection.<span class="cm-property">find({<span class="cm-string">'age': {<span class="cm-string">'$gt': <span class="cm-number">20}})<span class="cm-tab"> <span class="cm-comment"># 查找年龄大于20的<br> <span><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"> </p>
<h5 class="md-end-block md-heading"><span class="md-plain">噩梦条件</span></h5>
<pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded"> <span><span class="cm-keyword">and<span class="cm-variable">条件<span class="cm-tab"> {<span class="cm-error">$<span class="cm-keyword">and: [{<span class="cm-variable">expression1}, {<span class="cm-variable">expression2}, ...] }<br> <span><span class="cm-keyword">or <span class="cm-variable">条件<span class="cm-tab"> {<span class="cm-error">$<span class="cm-keyword">or: [{<span class="cm-variable">expression1}, {<span class="cm-variable">expression2}, ...] }<br> <span><span class="cm-keyword">and <span class="cm-variable">和or混用<br> <span><span class="cm-variable">db.<span class="cm-property">table.<span class="cm-property">find({<span class="cm-error">$<span class="cm-keyword">or:[{<span class="cm-error">$<span class="cm-keyword">and:[{<span class="cm-variable">sex:<span class="cm-string">'女'}, {<span class="cm-variable">age:<span class="cm-number">18}]},{<span class="cm-error">$<span class="cm-keyword">and:[{<span class="cm-variable">sex:<span class="cm-string">'男'}, {<span class="cm-variable">age:{<span class="cm-error">$<span class="cm-variable">gt:<span class="cm-number">18}}]}]})<br> <span><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<h5 class="md-end-block md-heading"><span class="md-plain">比较符号</span></h5>
<table class="md-table">
<thead>
<tr class="md-end-block"><th><span class="td-span"><span class="md-plain">操作符</span></span></th><th><span class="td-span"><span class="md-plain">描述</span></span></th><th><span class="td-span"><span class="md-plain">示例</span></span></th></tr>
</thead>
<tbody>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">$lt</span></span></td>
<td><span class="td-span"><span class="md-plain">小于 less than</span></span></td>
<td><span class="td-span"><span class="md-plain">{'age': {'$lt': 24}}</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">$gt</span></span></td>
<td><span class="td-span"><span class="md-plain">大于 greater than</span></span></td>
<td><span class="td-span"><span class="md-plain">{'age': {'$gt': 18}}</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">$lte</span></span></td>
<td><span class="td-span"><span class="md-plain">小于等于 less than or equal to</span></span></td>
<td><span class="td-span"><span class="md-plain">{'age': {'$lte': 20}}</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">$gte</span></span></td>
<td><span class="td-span"><span class="md-plain">大于等于 great than or equal to</span></span></td>
<td><span class="td-span"><span class="md-plain">{'age': {'$gte': 18}}</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">$ne</span></span></td>
<td><span class="td-span"><span class="md-plain">不等于 not equal to</span></span></td>
<td><span class="td-span"><span class="md-plain">{'age': {'$ne': 20}}</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">$in</span></span></td>
<td><span class="td-span"><span class="md-plain">在范围内</span></span></td>
<td><span class="td-span"><span class="md-plain">{'age': {'$in': }}</span></span></td>
</tr>
<tr class="md-end-block">
<td><span class="td-span"><span class="md-plain">$nin</span></span></td>
<td><span class="td-span"><span class="md-plain">不在范围内</span></span></td>
<td><span class="td-span"><span class="md-plain">{'age': {'$nin': }}</span></span></td>
</tr>
</tbody>
</table>
<h5 class="md-end-block md-heading"><span class="md-plain">过滤条件</span></h5>
<p class="md-end-block md-p"><span class="md-plain">支持正则匹配查询</span></p>
<pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded"> <span><span class="cm-variable">res = <span class="cm-variable">collection.<span class="cm-property">find({<span class="cm-string">'name': {<span class="cm-string">'$regex': <span class="cm-string">'^y.*'}})<span class="cm-tab"> <span class="cm-comment"># 查询姓名以y开头的</span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"> </p>
<p class="md-end-block md-p"><span><strong>find()方法支持链式的调用;或者说Collection对象的查询方法支持链式的调用</strong></span></p>
<h4 class="md-end-block md-heading"><span class="md-plain">计数</span></h4>
<p class="md-end-block md-p"><span class="md-plain">调用count()方法,返回查询结果有多少条数据</span></p>
<pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded"> <span><span class="cm-keyword">count = collection<span class="cm-variable-2">.find()<span class="cm-variable-2">.count()</span></span></span></span></pre>
<h4 class="md-end-block md-heading"><span class="md-plain">排序</span></h4>
<p class="md-end-block md-p"><span class="md-plain">调用sort()方法,并在其中传入排序的字段及升降序标志</span></p>
<p class="md-end-block md-p"><span class="md-plain">pymongo.ASCENGING指定升序<span class="md-tab"> <span class="md-plain">||<span class="md-tab"> <span class="md-plain">pymongo.DESCENGING指定降序</span></span></span></span></span></p>
<pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded"> <span>collection<span class="cm-variable-2">.find()<span class="cm-variable-2">.sort(<span class="cm-string">'name', pymongo<span class="cm-variable-2">.ASCENGING)<span class="cm-tab"> <span class="cm-tab"> # 对查询结果升序排列</span></span></span></span></span></span></span></pre>
<h4 class="md-end-block md-heading"><span class="md-plain">限制</span></h4>
<p class="md-end-block md-p"><span class="md-plain">limit()方法,限制查询的结果。该方法接受一个int型</span></p>
<pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded"> <span>collection<span class="cm-variable-2">.find()<span class="cm-variable-2">.sort(<span class="cm-string">'name', pymongo<span class="cm-variable-2">.ASCENGING)<span class="cm-variable-2">.limit(<span class="cm-number">3)<span class="cm-tab"># 截取结果的前3个</span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"> </p>
<h3 class="md-end-block md-heading"><span class="md-plain">更新</span></h3>
<p class="md-end-block md-p"><span class="md-plain">使用 update()_one 方法,修改一条,指定更新的条件和更新后的数据即可</span></p>
<pre class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded"> <span><span class="cm-variable">condition = {<span class="cm-string">'name': <span class="cm-string">'yelan'}<br> <span><span class="cm-variable">res = <span class="cm-variable">collection.<span class="cm-property">update_one(<span class="cm-variable">condition, {<span class="cm-string">'$set': {<span class="cm-string">'name': <span class="cm-string">'wang'}})<br> <span><span class="cm-builtin">print(<span class="cm-variable">res)<span class="cm-tab"><span class="cm-comment"># 返回updateResult类型,该类型有以下属性<br> <span><span class="cm-builtin">print(<span class="cm-variable">res.<span class="cm-property">matched_count, <span class="cm-variable">res.<span class="cm-property">modified_count)<span class="cm-tab"> <span class="cm-comment"># 属性:获取匹配的数据条数;影响的数据条数(被修改的)<br> <span><span><br> <span><span><br> <span><span><br> <span><span class="cm-comment"># 当然也可以先查找,然后以字典的赋值的方式修改字段即可。如:<br> <span><span class="cm-variable">student = <span class="cm-variable">collection.<span class="cm-property">find_one(<span class="cm-variable">condition)<br> <span><span class="cm-variable">student[<span class="cm-string">'name'] = <span class="cm-string">'wang'<br> <span><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">update_many()方法,修改满足条件的多条数据</span></p>
<p class="md-end-block md-p"><span class="md-plain">假设我要对某文档中年龄大于18岁的所有成员+1岁。使用操作符:'$inc' 自增1</span></p>
<pre class="md-fences mock-cm md-end-block md-fences-with-lineno">condition = {'age': {'$gt': 18}}
result = collection.update_many(condition, {'$inc': {'age': 1}})
</pre>
<p class="md-end-block md-p"> </p>
<h3 class="md-end-block md-heading"><span class="md-plain">删除</span></h3>
<p class="md-end-block md-p"><span class="md-plain">remove()方法指定删除的条件即可,符合条件的数据都会删除</span></p>
<pre class="md-fences mock-cm md-end-block md-fences-with-lineno">res = collection.remove({'name': 'yelan'})
res会返回删除的数量
</pre>
<p class="md-end-block md-p"><span class="md-plain">推荐使用 delete_one()和delete_many()方法分别删除满足条件的一条和多条数据</span></p>
<pre class="md-fences mock-cm md-end-block md-fences-with-lineno">collection.delete_one({'age': 20})
# 删除年龄小于18或者年龄大于60的多条数据
collection.delete_many({$or: [{'age': {'$lt': 18}}, {'age': {'$gt': 60}}]})
</pre>
<p class="md-end-block md-p"> </p>
<h4 class="md-end-block md-heading"><span class="md-plain">其他操作</span></h4>
<p class="md-end-block md-p"><span class="md-plain">pymongo还提供了一些组合方法,如find_one_delete()、find_one_update()等,查找后删除、查找后更新。</span></p>
<p class="md-end-block md-p"><span class=" md-link"><span class="md-plain">http://api.mongodb.com/python/curent/api/pymongo/collection.html</span></span></p>
<p class="md-end-block md-p"> </p>
<h4 class="md-end-block md-heading"><span class="md-plain">自定义封装</span></h4>
<pre class="md-fences mock-cm md-end-block md-fences-with-lineno">class MyMongodb:
def __init__(self, db, collection): # 初始化传入使用的数据库,集合
self.client = pymongo.MongoClient(host='127.0.0.1', port=27017) # 初始化时连接mongo
self.db = self.client # 初始化时进入使用的数据库
self.my_col = self.db # 初始化时进入集合操作
def insert(self, dict, only_one=True):
if only_one:
self.my_col.insert_one(dict)
else:
self.my_col.insert_many(dict)
def find(self, find_one=True, ):
if find_one:
result_one = self.my_col.find_one()
pprint(result_one)
# elif find_one and condition:
# result_con = self.my_col.find_one()
# pprint(result_con)
else:
result_many = self.my_col.find()
for u in result_many:
print(u)
def update(self, data, new_data, update_one=True):
if update_one:
self.my_col.update_one(data, {'$set': new_data})
else:
self.my_col.update_many(data, {'$set': new_data})
def remove(self, data, delete_one=True):
if delete_one:
self.my_col.delete_one(data)
else:
self.my_col.delete_many(data)
if __name__ == '__main__': # 主程序入口
my_db = MyMongodb('test_db', 'stu') # 传入的数据库和集合,有则使用,无则创建
my_db.insert({'name': '夜阑', 'sex': '男', '年龄': 20})# 1.插入一条文档
my_db.insert([
{'name': '夜阑', 'sex': '男', 'age': 18},
{'name': 'liu', 'sex': '男', 'age': 24},
{'name': 'dan', 'sex': '女', 'age': 24},
], only_one=False) # 插入多条数据
my_db.find(find_one=False) # 查看多条,默认查看一条
my_db.update({'name': '夜阑'}, {'name': '小红', 'age': 22}) # 更新一条
my_db.update({'name': '夜阑'}, {'name': '小红', 'age': 22}, update_one=False) # 更新满足条件的多条数据
my_db.remove(({'name': 'liu'}), delete_one=False) # 删除指定的多条
</pre><br><br>
来源:https://www.cnblogs.com/yelan5222/p/12080292.html
頁:
[1]