MongoDB入门
一丶MongoDB简介
MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。它支持的数据结构非常松散,是类似JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。
MongoDB 的官方网站地址是:http://www.mongodb.org/
二丶MongoDB特点
其最大特点是支持的查询语言非常强大,语法类似面向对象查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引,是一个面向集合,模式自由的文档型数据库.特点总结如下:
- (1)面向集合存储,易于存储对象类型的数据
- (2)模式自由
- (3)支持动态查询
- (4)支持完全索引,包含内部对象
- (5)支持复制和故障恢复
- (6)使用高效的二进制数据存储,包括大型对象(如视频等)
- (7)自动处理碎片,以支持云计算层次的扩展性
- (8)支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++语言的驱动程序,社区中也提供了 对 Erlang 及.NET 等平台的驱动程序
- (9) 文件存储格式为 BSON(一种 JSON 的扩展)
三丶MongoDB的体系结构
MongoDB 的逻辑结构是一种层次结构。主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。
- (1)MongoDB 的文档(document),相当于关系数据库中的一行记录。
- (2)多个文档组成一个集合(collection),相当于关系数据库的表。
- (3)多个集合(collection),逻辑上组织在一起,就是数据库(database)。
- (4)一个 MongoDB 实例支持多个数据库(database)。
文档(document)、集合(collection)、数据库(database)的层次结构如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LJfGMGzS-1583142573537)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\image-20200228182418419.png)]
四丶MongoDB与MySQL数据库逻辑结构概念的对比
MongoDb | 关系型数据库Mysql |
---|---|
数据库(databases) | 数据库(databases) |
集合(collections) | 表(table) |
文档(document) | 行(row) |
五丶安装与下载
安装包:[mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi]
六丶启动服务(可配置环境变量)
- 首先在本机创建一个用于存放数据的目录:md data\db
- 启动服务:mongod --dbpath=d:\data\db,dbpath参数用于指定数据存储目录
- 如果不是默认端口27017,我们可以通过命令来修改端口
- mongod --port 12306 --datapath d:\data\db
七丶登录系统
- 如果mongoDB是部署在本机,且按默认端口启动的,则直接输入mongo,便可以登录系统,默认连接的是test测试库
- 如果连接远程的mongoDB服务器,使用命令:mongo 远程IP
- 如果远程mongoDB的服务端口不是默认的,应该指定端口:mongo 远程ip:端口
- exit可以退出
八丶基本增删改查操作
- 使用数据库:use 数据库名 ,如果该数据库不存在会自动创建
- 插入文档,文档相当于关系数据库中的记录
- 定义一个文档变量,格式为:变量名称={},eg:r={name:‘娃哈哈’,age:22};
- 将变量存入MongoDB,db.集合名称.save(),eg:db.student.save®;集合相当于数据库中的表,student不存在会自动创建.
- 也可以把变量直接放入save参数中,eg:db.student.save({name:“沙和尚”,sex:“男”},在插入时会自动生成ObjectId,也可以手动插入_id;
- 查询结合:db.集合名称,find();查询集合中所有文档
- 条件查询:db.集合名称.find(参数),参数为json格式,eg:db.student.find({sex:‘女’})
- 返回符合条件的第一条数据:db.student.findOne(参数)
- 返回前几条数据:sb.集合名称.find().limit(条数);
- 修改文档
- update修改:db.集合名称.update({条件参数},{修改字段参数}),在操作之后会发现只剩下_id和修改字段
- mongodb提供了修改其KaTeX parse error: Expected '}', got 'EOF' at end of input: …update({条件参数},{set:{修改参数}}),字段都保留也修改成功
- 删除文档
- db.集合名称.remove(条件),eg:db.student.remove({name:‘猪八戒’})
九丶高级查询
-
模糊查询
- 格式为/模糊查询字符串/,eg:查询address中带洞的文档
- db.student,find({address:/洞/})
- 以指定条件开头,格式/^条件/,eg:
- db.student.find({name:/^白/})
- 格式为/模糊查询字符串/,eg:查询address中带洞的文档
-
null值处理
- 将查询条件值改为null就可以查询出来,eg:
- db.student.find({address:null})
- 注:该查询会查询出该字段为null值的以及不存在该字段的文档记录
- 将查询条件值改为null就可以查询出来,eg:
-
大于小于不等于
- db.collection.find({ “field” : { $gt: value } } ); // 大于: field > value
- db.collection.find({ “field” : { $lt: value } } ); // 小于: field < value
- db.collection.find({ “field” : { $gte: value } } ); // 大于等于: field >= value
- db.collection.find({ “field” : { $lte: value } } ); // 小于等于: field <= value
- db.collection.find({ “field” : { $ne: value } } ); //不等于
- eg:查询年龄大于20的学生:db.student.find({age:{$gt:20}})
-
是否存在,$exists操作符,eg:查询所有包含address字段的数
- db.student.find({address:{$exists:true}})//存在该字段
- db.student.find({address:{$exists:falst}})//不存在该字段
-
包含于不包含:$in和nin;eg年龄包含在20,30,和不包含20,30
- db.studen.find({age:{$in:[20,30]}})
- db.studen.find({age:{$nin:[20,30]}})
-
统计记录条数count()
- db.student.count()查询文档条数
- db.student.count({age:{$lt:20}});//年龄小于20的文档条数
-
条件连接,并且,当查询时要满足两个以上条件,使用$and操作符进行关联,格式为:
- $and:[{},{},{}]
- db.student.find(KaTeX parse error: Expected '}', got 'EOF' at end of input: and:[{age:{gt:20}},{age:{$lt:30}}])//大于20小于30的学生
- $and:[{},{},{}]
-
条件连接,或者$or,用法和并且一直
$and:[{},{},{}]- db.student.find(KaTeX parse error: Expected '}', got 'EOF' at end of input: and:[{age:{gt:20}},{age:{$lt:30}}])//大于20小于30的学生
-
条件连接,或者$or,用法和并且一直