MongoDB 的使用

MongoDB 作为一款非关系型数据库很适合在爬虫上使用,操作简单易上手,本篇博客主要就是记录 MongoDB 在 python 上的库 mongodb 的一些使用方法。

使用 pymongo 之前要确保电脑上已经安装好了 MongoDB 数据库并启动了服务并且安装好了 pymongo 库。

连接数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
from pymongo import MongoClient
# 客户端方法可以传递用户名,密码,地址,端口等参数,不传递则默认连接本机数据库,端口为 27017
client = MongoClient(host='localhost',port=27017)
# 此外还有一种连接方式就是向 MongoClient 的第一个参数 host 直接传一个连接字符串,以 mongodb 开头
# 例如:client = MongoClient('mongodb://localhost:27017/')

# 表示连接 data 数据库
db = client['data']
# 此处也可以使用 db = client.data 也可以达到同样的效果

# 表示连接 user 集合
user = db['user']
# 也可以使用 user = db.user

需要注意的是在连接数据库和集合时,如果连接的对象不存在将会被直接创建而不是报错,所以数据库和集合的创建也可以通过这种方式。连接上数据库之后就是一些基本的增删改查操作了

相关操作

插入

pymongo 的增操作总共有三种方式 insert() , insert_one() , insert_many()

pymongo 插入的数据一般都是字典格式,为了方便描述举两个例子

1
2
user1 = {'name':'a','gender':'female','age':18}
user2 = {'name':'b','gender':'male','age':21}

比如说现在要向 user 集合中插入数据则可以使用以下语句

1
2
3
4
5
6
7
8
9
10
# 插入一个数据
user.insert(user1)
# 在MongoDB中,每条数据其实都有一个_id属性来唯一标识,如果没有显式指明_id,MongoDB会自动产生一个ObjectId类型的_id属性。
# insert 语句会返回插入元素在集合中的 _id 值

# 插入多个元素
# 插入多个元素时需要将待插入元素放入数组中作为参数
user.insert([user1,user2])
# 同样,insert 语句会返回一个包含着所有插入元素 _id 值的列表
# 这条语句是将元素从列表中取出后再分别插入而不是将整个列表插入

insert() 方法现在不被推荐使用,官方推荐使用 insert_one() 和 insert_many() 方法,这两个方法的使用和前面 insert() 方法对于单个和多个元素的使用并没有什么区别,唯一的区别就是返回值不同,insert_one() 和 insert_many() 方法返回的是一个 InsertManyResult 类型的对象,如果要查看插入对象的 _id 则需要调用 inserted_id 和 inserted_ids 来查看插入的元素的 _id 值

删除

1
2
# 若不加参数将会删除所有数据
user.remove({'name':'a'})

修改

mongodb 中的数据修改有 update 和 save 两种方法。

update 命令

update命令格式:

db.collection.update(criteria,objNew,upsert,multi)

参数说明:

criteria:查询条件

objNew:update对象和一些更新操作符

upsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。

multi:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。

示例:

把 age 大于 18 的 name 改为 adult

1
user.update({'age':{'$gt':18}},{$set:{'name':'adult'}})

由于没有指定 multi 参数,所以默认只修改第一条记录,否则会将所有符合条件的记录全部修改。

update 的数据更新修饰符

1.$inc

用法:{$inc:{field:value}}

作用:对一个数字字段的某个field增加value

示例:将 name 值为 a 的记录的 age 增加 5

1
user.update({'name':'a'},{'$inc':{'age':5}})

2.$set

用法:{$set:{field:value}}

作用:把文档中某个字段field的值设为value

示例:将 name 值为 a 的记录的 age 设为 17

1
user.update({'name':'a'},{'$set'{'age':17}})

3.$unset

用法:{$unset:{field:1}}

作用:删除某个字段field

示例:删除 nsme 为 b 的记录的 age 字段

1
user.update({'name':'b'},{'$unset':{'age':''}})

删除字段时只要将字段名称给出即可,后面的 value 可以使任意值

$rename

用法:{$rename:{old_field_name:new_field_name}}

作用:对字段进行重命名

示例:将 name 值为a 的记录的 sex 字段改为 gender

1
user.update({'name':'a'},{'$rename':{'sex':'gender'}})

查询

pymongo 的查询语句有 find() 和 find_one() 两种方法,find_one() 只能得到一个查询结果,find() 方法可以得到多条结果,当然也可以只得到一个结果

1
2
3
result1 = user.find({'name':'a''age':18})
result2 = user.find_one({'name':'a''age':18})
# 这两个语句得到的结果都是一样的

以上语句为精确查询,除了这种方法外还可以使用按条件的模糊查询。

一些查询关键字如下:

$ne–>不等于

$gt–>大于

$gte–>大于等于

$lt–>小于

$lte–>小于等于

$in–>在范围内

$nin–>不在范围内

$exists–>是否存在字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查询姓名不为 a 的项
result = user.find({'name':{'$ne':'a'}})
# 查询年龄大于 18 的项
result = user.find({'age':{'$gt':18}})
# 查询年龄大于等于 18 的项
result = user.find({'age':{'$gte':18}})
# 查询年龄大于 18 的项
result = user.find({'age':{'$lt':18}})
# 查询年龄小于等于 18 的项
result = user.find({'age':{'$lte':18}})
# 查询年龄为 1,18 之间的项
result = user.find({'age':{'$in':[1,18]}})
# 查询年龄不在 1,18 之间的项
result = user.find({'age':{'$nin':[1,18]}})
# 查询姓名中存在'a'字段的项
result = user.find({'name':{'$exists':'a'}})

将 MongoDB 中的数据导出

数据导出需要借助 MongoDB 自带的工具 mongoexport ,这个工具存放在 MongoDB 安装位置的 bin 目录下。需要使用命令行运行。

参数的含义

-h,–host :代表远程连接的数据库地址,默认连接本地Mongo数据库;

–port:代表远程连接的数据库的端口,默认连接的远程端口27017;

-u,–username:代表连接远程数据库的账号,如果设置数据库的认证,需要指定用户账号;

-p,–password:代表连接数据库的账号对应的密码;

-d,–db:代表连接的数据库;

-c,–collection:代表连接数据库中的集合;

-f, –fields:代表集合中的字段,可以根据设置选择导出的字段;

–type:代表导出输出的文件类型,包括csv和json文件,默认导出为json格式

-o, –out:代表导出的文件名,可以指定保存路径;

-q, –query:代表查询条件;

–skip:跳过指定数量的数据;

–limit:读取指定数量的数据记录;

–sort:对数据进行排序,可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列,如sort({KEY:1})。

示例:将本地数据库 data 下的集合 test 中的数据全部导出

1
mongoexport -d data -c test -f name,age,gender --csv -o test.csv

执行上述命令后,会将 test 集合中的 name,age,gender 字段全部导出,需要注意的是,若要将数据导出为 csv 格式的文件则必须要指定导出的字段,

-----------本文结束感谢您的阅读-----------
0%