python操作mongoDB

1.安装mongoDB数据库

我是在windows环境中安装的mongoDB,方法见https://www.cnblogs.com/Forever77/p/11193704.html

2.安装pymongo模块

windows环境中,直接在cmd命令窗口中执行pip3 install pymongo

验证是否安装成功,通过python进入交互环境,输入import pymongo不报错即可

3.python操作mongoDB基本方法

  • from pymongo import MongoClient   #导入模块
  • client = MongoClient('mongodb://username:password@ip:port')   #初始化数据库连接
  • database = client['dbname']   #创建数据库
  • table = database['tablename']   #创建数据库中的表
  • table.insert(dic)   #向数据表中插入对象

以下以通过requests爬取豆瓣https://book.douban.com/tag/%E6%BC%AB%E7%94%BB?start=0&type=T的书籍信息为例进行说明。

①初始化数据库连接

import requests
import lxml
import re
import pymongo
from bs4 import BeautifulSoup
myclient = pymongo.MongoClient('mongodb://localhost:27017/')#本地计算机ip可使用localhost表示,此种情况参数可直接省略

如果mongoDB运行在本地且没有修改过默认端口(27017),也没有设置权限验证,那么初始化连接的参数可以直接省略,client = MongoClient()

如果没有设置权限验证,可省略用户名和密码部分,client = MongoClient('mongodb://ip:port')

如果运行在本地但是设置了权限验证,可省略ip和port部分,client = MongoClient('mongodb://username:password') 

②创建数据库

db = myclient['douban']   # db = myclient.douban

创建数据库可通过方括号或者.方法,创建数据表同理。

 

③创建数据表,即collection

table = db['book']   # table = db.book

如果要对多个数据库或表进行操作,通常将库名或表名保存在列表中,然后使用循环通过方括号来操作。

table_name=['book1','book2','book3','book4','book5']
for table in table_name:
    table = db[table]
    ...

④插入记录

insert_one(),参数为字典,每次只能插入一条记录

insert_many(),参数为由字典组成的列表,一次可插入多条记录

insert(), 既可插入字典也可插入由字典组成的列表,insert()方法正在被遗弃

例如随意创建一个数据库school,再在school中创建一个集合student,存储学生的姓名、年龄和爱好。

>>> db = myclient['school']
>>> table = db['student']
>>> dic1 = {'name':'Alice','age':23,'hobby':'dance'}
>>> dic2 = {'name':'Jack','age':25,'hobby':'football'}
>>> dic3 = [ {'name':'Jane','age':26,'hobby':'panio'}, {'name':'Bob','age':25,'hobby':'tennis'}]
>>> dic4 = [ {'name':'Alan','age':22,'hobby':'paint'}, {'name':'Smith','age':24,'hobby':'sing'}]
>>> table.insert(dic1)
ObjectId('5dd8ba03202fc313bb9d053b')
>>> table.insert_one(dic2)
<pymongo.results.InsertOneResult object at 0x0000028B17582E48>
>>> table.insert_many(dic3)
<pymongo.results.InsertManyResult object at 0x0000028B175B6DC8>
>>> table.insert(dic4)
[ObjectId('5dd8ba1a202fc313bb9d053f'), ObjectId('5dd8ba1a202fc313bb9d0540')]

可以看到insert()的返回会返回插入记录的主键,而insert_one()和insert_many()返回一个pymongo结果对象,不过这对插入结果并没有什么影响。

⑤查询记录

table.find(查询条件,列筛选),查询条件和列筛选都用字典形式表达

find()的返回结果是一个可迭代的pymongo对象,需要通过循环将内容取出。

>>> result1 = table.find({'age':25},{'_id':0,'age':0})
>>> result1
<pymongo.cursor.Cursor object at 0x0000028B175867F0>
>>> result2 = [s for s in table.find({'age':25},{'_id':0,'age':0})]
>>> result2
[{'name': 'Jack', 'hobby': 'football'}, {'name': 'Bob', 'hobby': 'tennis'}]
>>> result3 = [s for s in table.find({'age':{'$gt':23,'$lte':25}},{'_id':0})]
>>> result3
[{'name': 'Jack', 'age': 25, 'hobby': 'football'}, {'name': 'Bob', 'age': 25, 'hobby': 'tennis'}, {'name': 'Smith', 'age': 24, 'hobby': 'sing'}]

⑥更新记录

update_one({查询条件},{更新操作}) 更新满足条件的第一条记录

update_many({查询条件},{更新操作}) 更新所有满足条件的记录

update({查询条件},{更新操作}) 更新满足条件的第一条记录,update()用法正在被淘汰

>>> table.update({'age':25},{'$set':{'hobby':'reading'}})
{'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}
>>> table.update_one({'age':25},{'$set':{'hobby':'football'}})
<pymongo.results.UpdateResult object at 0x0000028B175C0988>
>>> table.update_many({'age':25},{'$set':{'hobby':'running'}})
<pymongo.results.UpdateResult object at 0x0000028B175C0348>

⑦删除记录

delete_one({查询条件},{更新操作}) 删除满足条件的第一条记录

delete_many({查询条件},{更新操作}) 删除所有满足条件的记录

没有delete()方法

>>> dic5= [ {'name':'Alex1','age':28,'hobby':'skiing'}, {'name':'Alex2','age':28,'hobby':'skiing'}, {'name':'Alex3','age':28,'hobby':'skiing'}]
>>> table.insert(dic5)
[ObjectId('5dda508b202fc313bb9d0541'), ObjectId('5dda508b202fc313bb9d0542'), ObjectId('5dda508b202fc313bb9d0543')]
>>> table.delete_one({'age':28})
<pymongo.results.DeleteResult object at 0x0000028B17582748>
>>> table.delete_many({'age':28})
<pymongo.results.DeleteResult object at 0x0000028B175B66C8>

附:爬取豆瓣书籍信息

import requests
import lxml
import re
import pymongo
from bs4 import BeautifulSoup
myclient = pymongo.MongoClient()
db = myclient['douban']
table = db['book']
# use douban
urllist = []
for i in range(10):
    url = 'https://book.douban.com/tag/%E6%BC%AB%E7%94%BB?start='+str(20*i)+'&type=T'
    urllist.append(url)

for url in urllist:
    req = requests.get(url) 
    soup = BeautifulSoup(req.text,'lxml')
    book_all = soup.find('ul',class_='subject-list').find_all('li')for li in book_all:
        dic = {}
        dic['书名'] = li.h2.text.replace(' ','').replace('
','')
        dic['其他信息'] = li.find('div',class_ = 'pub').text.replace(' ','').replace('
','')
        dic['评分'] = li.find('span',class_ = 'rating_nums').text
        comment = li.find('span',class_ = 'pl').text.replace(' ','').replace('
','')
        dic['评价人数'] = re.search('d+',comment).group(0)
        table.insert_one(dic)
原文地址:https://www.cnblogs.com/Forever77/p/11438536.html