1.mongoDB简介
1.1简单介绍
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB:基于分布式文件存储的数据库
redis:基于内存的高性能的key-value数据库
1.2数据介绍
mongodb中的基本概念是文档、集合、数据库,与sql对比如下:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins |
| 表连接,MongoDB不支持 |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
MongoDB的默认数据库为"db",该数据库存储在data目录中。
数据类型 | 描述 | 举例 | 别名(来着官方文档) |
|
null Null | 表示空值或者未定义的对象 | {“x”:null} | “null” |
|
布尔值 Boolean | 真或者假:true或者false | {“x”:true} | “bool” |
|
32位整数 32-bit integer | 32位整数。shell是不支持该类型的,shell中默认会转换成64位浮点数 |
| “int” |
|
64位整数 64-bit integer | 64位整数。shell是不支持该类型的,shell中默认会转换成64位浮点数 |
| “long” |
|
64位浮点数
| 64位浮点数。shell中的数字就是这一种类型 | {“x”:3.14,”y”:3} |
|
|
字符串 String | UTF-8字符串 | {“foo”:”bar”} | “string” |
|
符号 Symbol | shell不支持,shell会将数据库中的符号类型的数据自动转换成字符串 |
| “symbol” | Deprecated. |
对象id ObjectId | 文档的12字节的唯一id | {“id”: ObjectId()} | “objectId” |
|
日期 Date | 从标准纪元开始的毫秒数 | {“date”:new Date()} | “date” |
|
正则表达式 Regular Expression | 文档中可以包含正则表达式,遵循JavaScript的语法 | {“foo”:/foobar/i} | “regex” |
|
代码 | 文档中可以包含JavaScript代码 | {“x”:function() {}} |
|
|
未定义 Undefined | undefined | {“x”:undefined} | “undefined” | Deprecated. |
数组
| 值的集合或者列表 | {“arr”: [“a”,”b”]} |
|
|
内嵌文档 | 文档可以作为文档中某个key的value | {“x”:{“foo”:”bar”}} |
|
数据类型 | 描述 |
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Arrays | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
mongodb默认端口是27017
mongodb可以不设账号密码,通过IP地址和端口直接链接
退出输入:exit
2.表内查询语句
1.1 固定条件查询:
注:mongodb中每条数据都有一个id,用来唯一标识一条数据,id由mongo本身来维护
(1)db.getCollection('patent').find({});//查询集合中所有的数据
(2)db.getCollection('patent').find({"id":"596577b78587822df6a74cfa"});//查询id=596577b78587822df6a74cfa的数据
(3)db.getCollection('patent').find({"id":"596577b78587822df6a74cfa"},{"type_name":1});
//查询id=596577b78587822df6a74cfa的数据,只返回type_name字段数据;两个大括号,前面的存查询条件,后面的存返回条件,返回条件字段1表示true,表示此字段返回,如果name后面的1改为0则表示不返回name字段,返回除name字段以外的其他字段
[1]注:如果设置返回字段有为0的已经表示查询所有除了某字段以外的所有字段就不能再设置某个字段为1了,有语法冲突
[2]注:多条件查询此处是并列,但是如果多个条件都相同的话如db.getCollection('patent').find({"id":"596577b78587822df6a74cfa","id":"597a23648587822df63b8b80"});则会只查询后一个条件的数据
(4)db.getCollection('patent').find({},{"id":1});//查询所有的数据,返回id字段
(5)db.getCollection('patent').findOne({})//查询集合的第一条数据
1.2筛选查询:
gt(greater than)大于;
lt(less than)小于;
gte(greater than equal)大于等于;
lte(less than equal)小于等于;
ne(not equal)不等于.
db.getCollection('testErin').find({"age":{$gt:22}});//查询age大于22的数据
db.getCollection('testErin').find({"age":{$gte:22,$lt:24}});
1.3包含:
(1)db.getCollection('testErin').find({"weight":{$all:[11,8,5]}});//(包含 并且 包含)此处weight是个数组,此方法查询所有weight包含5,8和11的数据
(2)db.getCollection('testErin').find({"weight":{$in:[10,5]}});//(包含 或者 包含)
(3)db.getCollection('testErin').find({"weight":{$nin:[20,18]}});//(不包含 并且 不包含),如果没有weight字段的document也会显示
(4)db.getCollection('testErin').find({$or:[{"name":"小明"},{"weight":{$in:[8]}}]});//or或者,name=小明或者weight中有8
(5)db.getCollection('testErin').find({$nor:[{"name":"小明","name":"二明"},{"weight":{$in:[1,10,15]}}]});//既不 也不
1.4分页:
(1)db.getCollection('testErin').find().skip().limit(5);第一页,5条数据
skip()默认0,表示起始位置,limit表示每页显示数量。
(2)db.getCollection('testErin').find().skip(5).limit(5);表示第二页
skip = (页数 - 1) * limit
1.5排序:
db.getCollection('testErin').find().sort({"age":-1});//按照年龄降序排序,为1的话表示升序排序
1.6存在
db.getCollection('testErin').find({"weight":{$exists:0}});//查询不存在weight字段的数据
注:测试发现只有0表示不存在,其他任意数表示存在
1.7删除:
db.getCollection('testErin').remove({age:20,name:"小明"});//删除age为20,name为小明的数据
注:条件同时满足才删除
1.8更新:
(1)db.getCollection('testErin').update({name:"二明"},{age:24});//将查询到的第一条name=“二明”的字段覆盖为age=24
(2)db.getCollection('testErin').update({name:"三明"},{$set:{age:28}});
//将查询到的第一条name:"三明"字段的age更新为28
(3)db.getCollection('testErin').update({name:"四明"},{$set:{age:28}},1,1);//将所有name=四明的字段的age更新为28.
与(2)相比多了两个参数,第一个参数:表示如果没有符合条件的记录是否新增一条记录,1表示新增,0表示不新增;第二个参数:表示有多条数据符合筛选条件的话是否全部更改,默认为0只改第一条,改为1后表示全部更改。
(4)db.getCollection('testErin').update({age:21},{$set:{name:"明明明"}, $inc:{age:-2}},1,1);
更新所有age=21的字段修改name=明明明,并且所有age减2
$inc表示使某个键值加减指定的数值
(5)db.getCollection('testErin').update({name:"明明明"},{$unset:{age:1}},0,1);
//此处表示删除name=明明明 的age字段
$unset用来删除某个键
1.8索引
mongo默认为每条数据的_id字段建索引
(1)db.getCollection('testErin').ensureIndex({age:1});//为age字段建普通索引
(2)db.getCollection('testErin').dropIndex({age:1});//删除age字段的索引
(3)db.getCollection('testErin').ensureIndex({age:1},{unique:true});//为age字段建唯一索引,要求age值不重复
且 为字段建了唯一索引后就不能再添加相同值的记录了
db.getCollection('testErin').dropIndex({age:1},{unique:true});删除唯一索引
1.9数据备份/恢复、导出/导入
在网上查找的语句都无效,如下:
推荐使用可视化工具进行导入导出,非常方便,操作简单。例如:NoSQL Manager for MongoDB。
附:https://docs.mongodb.com/官方文档