分布式数据库NoSQL(七)——Python 访问MongoDB

Python MongoDB

MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。

Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接。 本实训项目主要学习如何安装pymongo,并通过该驱动建立连接,访问数据库,进行集合操作。

pymongo可参考菜鸟教程Python MongoDB | 菜鸟教程 (runoob.com) 

增删改查等操作:Python Mongodb 插入文档 | 菜鸟教程 (runoob.com)

Python Mongodb 查询文档 | 菜鸟教程 (runoob.com) 

Python Mongodb 修改文档 | 菜鸟教程 (runoob.com) 

Python MongoDB 排序 | 菜鸟教程 (runoob.com) 

Python Mongodb 删除数据 | 菜鸟教程 (runoob.com) 


目录

第1关:python连接MongoDB写入数据 

pip 安装

编程要求

第2关:检索文档 

相关知识

实例1:查找 sites 集合中的所有数据

实例2:查询指定字段的数据

实例3:同时指定了 0 和 1 则会报错

实例4:查找 name 字段为 "RUNOOB" 的数据:

编程要求

第3关:更新数据 

相关知识

任务描述

编程要求


第1关:python连接MongoDB写入数据 

一、本关任务:安装pymongo

二、相关知识

pip 安装

pip 是一个通用的 Python 包管理工具,提供了对 Python 包的查找、下载、安装、卸载的功能。 MongoDB的python接口pymongo的安装方法有多种,如源码、easy_install、pip都可以。采用pip安装,很简单。 pip install pymongo 安装完成后可以检查下安装信息 pip show pymongo 测试 PyMongo

1、导入pymongo库

import pymongo

2、使用MongoClient对象创建与数据库服务器的连接

如下实例中,我们创建的数据库 runoobdb :

client=MongoClient(host='127.0.0.1',port=12717)                                                                    也可以连接到具体的mongod服务器或副本集: client=MongoClient(host='10.90.9.102',port=12718) client=MongoClient(host='10.90.9.101:27018,10.90.9.102: 12718,10.90.9.103:27018')          mydb = client["runoobdb"]

3、访问数据库

创建MongoClient实例后,就可以访问服务器中的任何数据。 如果要访问一个数据库,可以将其当作属性一样进行访问: db = client.myDB 也可以使用函数方式访问,如果不存在数据库,则系统会自动创建数据库: db = client.get_database("myDB")

注意:

在 MongoDB 中,数据库只有在内容插入后才会创建! 就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。

4、集合操作

(1)插入文档 在数据库中存储数据时,首先指定使用的集合,然后使用集合的insert_one()方法插入文档

mydict = { "name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com" } x = mycol.insert_one(mydict)

(2)可以使用方法insert_many()同时插入多个文档。

mylist = [ { "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" }, { "name": "QQ", "alexa": "101", "url": "https://www.qq.com" }, { "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" }, { "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" }, { "name": "Github", "alexa": "109", "url": "https://www.github.com" } ] x = mycol.insert_many(mylist)

#输出所有插入文档的_id值:print(x.inserted_ids)

输出结果类似如下:

[ObjectId('5b236aa9c315325f5236bbb6'), ObjectId('5b236aa9c315325f5236bbb7'), ObjectId('5b236aa9c315325f5236bbb8'), ObjectId('5b236aa9c315325f5236bbb9'), ObjectId('5b236aa9c315325f5236bbba')]

编程要求

按要求创建数据库连接及相应的数据库、集合 并向集合中写入如下文档: [ { "_id": 1, "name": "RUNOOB", "cn_name": "菜鸟教程"}, { "_id": 2, "name": "Google", "address": "Google 搜索"}, { "_id": 3, "name": "Facebook", "address": "脸书"}, { "_id": 4, "name": "Taobao", "address": "淘宝"}, { "_id": 5, "name": "Zhihu", "address": "知乎"} ]

根据提示,在右侧编辑器的#begin和#end之间按要求补充代码。

开始你的任务吧,祝你成功!

 #/usr/bin/python3
import pymongo
def write_mycol():
##########begin##################
### 通过默认端口创建本地连接
    client = pymongo.MongoClient(host='localhost',port=27017)
    
####创建mydb数据库及集合test,并向集合中写入要求的数据,写入后的结果集以mycol对象返回
    mydb = client['mydb']
    mycol = mydb['test']
 
    mylist = [
        {"_id":1,"name":"RUNOOB","cn_name":"菜鸟教程"},
        {"_id":2,"name":"Google","address":"Google 搜索"},
        {"_id":3,"name":"Facebook","address":"脸书"},
        {"_id":4,"name":"Taobao","address":"淘宝"},
        {"_id":5,"name":"Zhihu","address":"知乎"}
    ]
    
    x = mycol.insert_many(mylist)
    
    return mycol

##########end#####################

最开始输出测评时,系统自动生成加上了id....如图(我真的栓q),因为pymongo在字典没有id的情况下才会自动生成id,检查后发现是因为第二条数据输入的时候掉了‘_’,加上后就测评成功了。写代码的时候一定要仔细!

分布式数据库NoSQL(七)——Python 访问MongoDB_第1张图片

分布式数据库NoSQL(七)——Python 访问MongoDB_第2张图片

或者这样写也是可以的:

分布式数据库NoSQL(七)——Python 访问MongoDB_第3张图片 

 

第2关:检索文档 

相关知识

runoobdb数据库中sites集合中有如下文档

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}

{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'alexa': '1', 'url': 'https://www.google.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb8'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}

{'_id': ObjectId('5b236aa9c315325f5236bbba'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}

查询集合中所有数据

find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。

实例1:查找 sites 集合中的所有数据

import pymongo 
myclient= pymongo.MongoClient("mongodb://localhost:27017/") 
mydb = myclient["runoobdb"] 
mycol = mydb["sites"] 
for x in mycol.find(): 
    print(x)

实例2:查询指定字段的数据

我们可以使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。

import pymongo 
myclient = pymongo.MongoClient("mongodb://localhost:27017/") 
mydb = myclient["runoobdb"] 
mycol = mydb["sites"] 
for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }): 
    print(x) 

输出结果为: 
{'name': 'RUNOOB', 'alexa': '10000'} 
{'name': 'Google', 'alexa': '1'} 
{'name': 'Taobao', 'alexa': '100'} 
{'name': 'QQ', 'alexa': '101'} 
{'name': 'Facebook', 'alexa': '10'} 
{'name': '知乎', 'alexa': '103'}
{'name': 'Github', 'alexa': '109'} 

除了 _id 你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。

根据指定条件查询 我们可以在 find() 中设置参数来过滤数据。

实例3:同时指定了 0 和 1 则会报错

import pymongo 
myclient = pymongo.MongoClient("mongodb://localhost:27017/") 
mydb = myclient["runoobdb"] 
mycol = mydb["sites"] 
for x in mycol.find({},{ "name": 1, "alexa": 0 }): 
    print(x) 

错误内容大概如下: 
... 
pymongo.errors.OperationFailure: Projection cannot have a mix of inclusion and exclusion. 
... 

实例4:查找 name 字段为 "RUNOOB" 的数据:

(除了 alexa 字段外,其他都返回)

​import pymongo 
myclient = pymongo.MongoClient("mongodb://localhost:27017/") 
mydb = myclient["runoobdb"] 
mycol = mydb["sites"] 
myquery = { "name": "RUNOOB" } 
mydoc = mycol.find(myquery) 
for x in mydoc: 
    print(x) 

输出结果为:
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'RUNOOB', 'alexa': '10000', 'url': 'https://www.runoob.com'}

编程要求

根据提示,在右侧编辑器 Begin-End 中补充代码(请勿删除原有代码框架)。

  • 将以下文档插入 mydb2 数据库的 test2 集合中;
_id name sex age
1 Xiaoming man 21
2 Xiaohong woman 20
3 Xiaoliang man 22
  • 查找 age 大于等于21的 name
  #/usr/bin/python3
import pymongo
def read_mycol():
   myclient = pymongo.MongoClient(host='127.0.0.1',port=27017)
   mydb2 = myclient["mydb2"]
#########begin###########
####判断数据库mydb2中是否存在集合“test2”,如果存在则删除,重新创建同名集合
   collist = mydb2.list_collection_names()
   if "test2" in collist:
      mydb2.test2.drop()

   mycol = mydb2["test2"]
    
#########end#################
   mylist2 = [
      { "_id": 1, "name": "Xiaoming", "sex": "man","age":21},
      { "_id": 2, "name": "Xiaohong", "sex": "woman","age":20},
      { "_id": 3, "name": "Xiaoliang", "sex": "man","age":22}]  
 ##################begin###########
 ###向集合中写入数据对象mylist2,并查找age大于等于21的name,
   mycol.insert_many(mylist2)
   
   mycol_read = mycol.find({"age":{"$gte":21}},{"_id":1,"name":1})
  
#######end########################
   return mycol_read    #结果以mycol_read对象返回

分布式数据库NoSQL(七)——Python 访问MongoDB_第4张图片 

 

第3关:更新数据 

相关知识

1、更新数据

my_set.update(

        , #查询条件

        , #update的对象和一些更新的操作符

        {

         upsert:         #如果不存在update的记录,是否插入

         multi:          #可选,mongodb 默认是false,只更新找到的第一条记录

         writeConcern:         #可选,抛出异常的级别。

        }

)

总结:update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。如果查找到的匹配数据多于一条,则只会修改第一条;如果要修改所有匹配到的记录,可以使用 update_many()。

 

使用的测试数据如下:

分布式数据库NoSQL(七)——Python 访问MongoDB_第5张图片 

以下实例将查找所有以 F 开头的 name 字段,并将匹配到所有记录的 alexa 字段修改为 123:

实例:

import pymongo 
myclient = pymongo.MongoClient(host="localhost",port=27018) 
mydb = myclient["runoobdb"] 
mycol = mydb["sites"] 
myquery = {"name":{"$regex":"^F"}} 
newvalues = {"$set":{"alexa":"123"}}

x = mycol.update_many(myquery,newvalues)

print(x.modified_count, "文档已修改")

输出结果为:

分布式数据库NoSQL(七)——Python 访问MongoDB_第6张图片

 

2、删除数据

可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。 使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

实例:删除所有 name 字段中以 F 开头的文档:

import pymongo 
myclient = pymongo.MongoClient("mongodb://localhost:27017/") 
mydb = myclient["runoobdb"] mycol = mydb["sites"]
myquery = {"name":{"$regex":"^F"}}

x = mycol.delete_many(myquery)

print(x.deleted_count, "个文档已删除")

任务描述

根据提示,在右侧编辑器 Begin-End 中补充代码(请勿删除原有代码框架)。

  • 将以下文档插入 mydb3 数据库的 test3 集合中;
_id name sex age
1 Xiaoming man 21
2 Xiaohong woman 20
3 Xiaoliang man 22
  • 更新 Xiaohong 的信息为23岁;

编程要求

根据提示,在右侧编辑器补充代码

分布式数据库NoSQL(七)——Python 访问MongoDB_第7张图片

import pymongo
def update_mycol():
   myclient = pymongo.MongoClient(host='127.0.0.1',port=27017)
   mydb3 = myclient["mydb3"]
   if("test3" in mydb3.list_collection_names()):
      mydb3.drop_collection("test3")
   mycol3 = mydb3["test3"]
   mylist3 = [
      { "_id": 1, "name": "Xiaoming", "sex": "man","age":21},
      { "_id": 2, "name": "Xiaohong", "sex": "woman","age":20},
      { "_id": 3, "name": "Xiaoliang", "sex": "man","age":22}]  
  
###写入数据对象,修改"Xiaohong"的年龄为23,并将修改后的对象返回
##################begin############
   mycol3.insert_many(mylist3)
   myquery = {"name":"Xiaohong"}
   newvalues = {"$set":{"age":23}}
   mycol_update = mycol3.update_one(myquery,newvalues)
##############end################  
   return mycol_update

你可能感兴趣的:(分布式数据库NoSQL,头歌educoder,数据库,mongodb,nosql)