9.2 MongoDB数据库

一、概述

MongoDB是一种非关系型数据库,它没有表的概念,其数据库的基本组成单元是集合。
Python网络爬虫之使用PyMongoDB数据库

1、数据库

一个mongodb中可以建立多个数据库。

MongoDB的默认数据库为"db",该数据库存储在data目录中。

MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。

不能是空字符串("")。
不得含有’ '(空格)、.、$ 、/、\和\0 (空字符)。
应全部小写。
最多64字节。

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。

admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

2、文档(Document)

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

一个简单的文档例子如下:

{“site”:“182.254.168.202”, “name”:“网络爬虫实训平台”}

需要注意的是:

文档中的键/值对是有序的。
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
MongoDB区分类型和大小写。
MongoDB的文档不能有重复的键。
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

键不能含有\0 (空字符)。这个字符用来表示键的结尾。
.和$有特别的意义,只有在特定环境下才能使用。
以下划线"_"开头的键是保留的(不是严格要求的)。

3、集合

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

比如,我们可以将以下不同数据结构的文档插入到集合中:

{“site”:“www.baidu.com”}
{“site”:“www.google.com”,“name”:“Google”}
{“site”:“182.254.168.202”, “name”:“网络爬虫实训平台”,“num”:5}

当第一个文档插入时,集合就会被创建。

合法的集合名:

集合名不能是空字符串""。
集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
集合名不能以"system."开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。

此外还有其他相关知识请自行查询相关资料后学习,在此不一一赘述。关于安装与启动MongoDB,Windows系统请参考书本9.2.2节内容,其他系统可以百度搜索相关博客。

目前大家使用的虚拟机已经安装并配置好,且已经设置为开机自启动,大家进系统后直接输入 mongo 命令开始对MongoDB进行操作。

二、MongoDB数据库基本用法

1、数据库常用命令

(1)Help查看命令提示

help
db.help();
db.yourColl.help();
db.youColl.find().help();
(2)切换/创建数据库

use yourDB; 当创建一个集合(table)的时候会自动创建当前数据库
(3)查询所有数据库

show dbs;
(4)删除当前使用数据库

db.dropDatabase();

2、修改、添加、删除集合数据

(1)添加/插入文档

db.users.insert({“name”: “zhangsan”, “age”: 25});
添加的数据的数据列,没有固定,根据添加的数据为准
执行以下语句批量添加数据:

db.userInfo.insert([{“name”:“zhangsan”,“age”:21},{“name”:“lisi”,“age”:22},{“name”:“wangwu”,“age”:23},{“name”:“zhaoliu”,“age”:24},{“name”:“sunqi”,“age”:26},{“name”:“qianba”,“age”:22},{“name”:“mongo1”,“age”:23},{“name”:“mongo2”,“age”:24},{“name”:“mymongo”,“age”:25}]);
(2)修改

db.users.update({“age”: 25}, {$set: {“name”: “changeName”}});
相当于:update users set name = ‘changeName’ where age = 25;

db.users.update({“name”: “lisi”}, {$inc: {“age”: 50}});
相当于:update users set age = age + 50 where name = ‘lisi’;

db.users.update({“name”: “lisi”}, {$inc: {“age”: 50}, $set: {“name”:“hoho”}});
相当于:update users set age = age + 50, name = ‘hoho’ where name = ‘lisi’;

(3)删除

db.users.remove({“age”: 132});

3、聚集集合查询

(1)查询所有记录

db.userInfo.find();
相当于:select* from userInfo;
默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;”
但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize= 50;这样每页就显示50条记录了。

(2)查询去掉后的当前聚集集合中的某列的重复数据

db.userInfo.distinct(“name”);
会过滤掉name中的相同数据
相当于:select distict name from userInfo;

(3)查询age = 22的记录

db.userInfo.find({“age”: 22});
相当于: select * from userInfo where age = 22;

(4)查询age > 22的记录

db.userInfo.find({“age”: {$gt: 22}});
相当于:select * from userInfo where age >22;

(5)查询age < 22的记录

db.userInfo.find({“age”: {$lt: 22}});
相当于:select * from userInfo where age <22;

(6)查询age >= 25的记录

db.userInfo.find({“age”: {$gte: 25}});
相当于:select * from userInfo where age >= 25;

(7)查询age <= 25的记录

db.userInfo.find({“age”: {$lte: 25}});

(8)查询age >= 23 并且 age <= 26

db.userInfo.find({“age”: {$gte: 23, $lte: 26}});

(9)查询name中包含 mongo的数据

db.userInfo.find({“name”: /mongo/});
//相当于%%
select * from userInfo where name like ‘%mongo%’;

(10)查询name中以mongo开头的

db.userInfo.find({“name”: /^mongo/});
select * from userInfo where name like ‘mongo%’;

(11)查询指定列name、age数据

db.userInfo.find({}, {“name”: 1, “age”: 1});
相当于:select name, age from userInfo;
当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。

(12)查询指定列name、age数据, age > 25

db.userInfo.find({“age”: {$gt: 25}}, {“name”: 1, “age”: 1});
相当于:select name, age from userInfo where age >25;

(13)按照年龄排序

升序:db.userInfo.find().sort({“age”: 1});
降序:db.userInfo.find().sort({“age”: -1});

(14)查询name = zhangsan, age = 22的数据

db.userInfo.find({“name”: “zhangsan”, age: 22});
相当于:select * from userInfo where name = ‘zhangsan’ and age = ‘22’;

(15)查询前5条数据

db.userInfo.find().limit(5);
相当于:selecttop 5 * from userInfo;

(16)查询10条以后的数据

db.userInfo.find().skip(10);
相当于:select * from userInfo where id not in (
selecttop 10 * from userInfo
);

(17)查询在5-10之间的数据

db.userInfo.find().limit(10).skip(5);
可用于分页,limit是pageSize,skip是第几页*pageSize

(18)or与 查询

db.userInfo.find({$or: [{age: 22}, {age: 25}]});
相当于:select * from userInfo where age = 22 or age = 25;

(19)查询第一条数据

db.userInfo.findOne();
相当于:selecttop 1 * from userInfo;
db.userInfo.find().limit(1);

(20)查询某个结果集的记录条数

db.userInfo.find({“age”: {$gte: 25}}).count();
相当于:select count(*) from userInfo where age >= 20;

(21)按照某列进行排序

db.userInfo.find({***: {$exists: true}}).count();

db.userInfo.find({“age”: {$exists: true}}).count();
相当于:select count(age) from userInfo;

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-17
  • 2021-05-14
  • 2022-12-23
  • 2021-08-18
猜你喜欢
  • 2022-12-23
  • 2021-12-20
  • 2022-02-03
  • 2021-12-04
  • 2022-02-22
  • 2021-04-09
相关资源
相似解决方案