mongodb
-
MYSQL的默认端口号:3306
-
Mongodb的默认端口号:27017
NOSQL 非关系型数据库管理系统
用于超大规模的数据存储(eg:谷歌,Facebook)不需要固定的模式,无需多余操作就可以横向扩展
什么是MongoDB?
由C++编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多节点,可以保证服务器性能。
- 为WEB应用提供可扩展的高性能数据存储解决方案
- mongoDB数据存储为一个文档,数据结构由键值(key=>value)对组成
- mongoDB文档类似于JSON对象,字段值可以包含其他文档,数组及文档数组
概念解析
SQL | MongoDB | 解释说明 |
---|---|---|
table | collection | 集合 |
row(一行,一条记录) | document | 文档 |
column | field | 域(键值对) |
index | index | 索引 |
table joins | 不支持表格连接查询 | |
primary key | primary key | 主键,mongoDB自动将_id字段设置为主键 |
数据库
db。不同的数据库放在不同文件里面
show dbs 可以显示所有数据库的列表
数据库名:
不能是字符串(“”),不能有空格,.,,/,\0(空字符)最好不要使用中文(可能会出现中文乱码问题),全部小写,最多64字节
文档:
键值对,BSON
{”site":"xxxxx","age":25}
数据库服务和客户端 | ||
---|---|---|
MYSQL/Oracle | mongod | |
注意:
- 文档中的键值对是有序的
- 区分类型和大小写
- 不能有重复的键,
- 键:字符串(utf-8),不能含有空字符
- . $ 有特殊的含义,只有在特定环境下才使用
- _开头的键是保留的(不是严格要求的)
object
onject_id可以是任何类型的,一般默认为object类型
onject_id 中保存了创建的时间戳,所以不需要自己创建时间戳(timestap)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IpPiTmmw-1611392732234)(C:\Users\jry\AppData\Roaming\Typora\typora-user-images\image-20210123134431496.png)]
通过getTimestap函数来获取文档的创建时间
通过str来转换为字符串形式
日期
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iqoE0EMq-1611392732240)(C:\Users\jry\AppData\Roaming\Typora\typora-user-images\image-20210123134725981.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eBUxv13Z-1611392732243)(C:\Users\jry\AppData\Roaming\Typora\typora-user-images\image-20210123134808410.png)]
MongoDB的基本操作
一、创建数据库
use xxx
但是数据库里面没内容,插入内容后就会显示
二、删除数据库
db.dropDatabase()
切换到别的数据库才可以看到被删除了
三、创建集合
- db.createCollection(“employee”) 创建一个employee的集合
- db.mycol(集合名).insert({"_id":01,“name”:“马云”}) 直接插入,本来没有集合会自动创建一个mycol的集合
- show collections 显示数据库下面的集合
- db 查看当前的数据库
四、删除集合
db.tc(集合名).drop()
五、给集合中插入文档
db.集合名.insert(文档) 如果_id存在则抛出主键异常,不保存当前数据
db.集合名.save(文档) 如果_id存在则更新数据,如果不存在就插入数据
插入一条记录
var 文档名 = db.集合名.insert({插入的键值对内容})
插入多条记录
var 文档名 = db.集合名.insertOne({})
插入多个文档
var 文档名 = db.集合名.insertMany({})
插入数组
1.先创建一个数组
六、文档的更新
db.集合名.updata(
{query–查询条件}
upsert–true:如果不存在就插入,存在就更新,false:不更新
{$set"{更新的值}}—更新为什么值
multi:true/false—true:更新所有符合条件的值,false:只更新第一个符合条件的值
)
更新一个值
db.employee.update({“sex”:“男”},{$set:{“age”:18}})
凡是符合条件的全部更新
db.employee.update({“sex”:“男”},{$set:{“age”:18}},{multi:true})
七、文档查询
1.条件符
$gt | > |
---|---|
$gte | >= |
$lt | < |
$lte | <= |
$ne | != |
$eq | 、= |
查询年龄小于19的记录
查询年龄小于等于19的记录
查询年龄小于30,地址在延安的
db.employee.find({“age”:{$lt:20},“address”:“延安”})
2.AND OR条件符
AND
db.employee.find({'KaTeX parse error: Expected '}', got 'EOF' at end of input: and':[{"age":{ lt:20}},{“address”:“延安”}]})
‘$and’–与关系符
[{条件1},{条件2}]
OR
db.employee.find({'KaTeX parse error: Expected '}', got 'EOF' at end of input: or':[{"age":{
lt:20}},{“address”:“延安”}]}))
db.employee.find({"KaTeX parse error: Expected '}', got 'EOF' at end of input: …":"女"},{"age":{
gt:10}}]})
性别为女,年龄>10
robo 3T上查询
AND 和 OR 联合使用
先与再或
db.employee.find({“sal”:{ KaTeX parse error: Expected 'EOF', got '}' at position 9: gt:17000}̲,'or’:[{“sex”:“女”},{“address”:“延安”}]})
db.employee.find({“sal”:{ KaTeX parse error: Expected 'EOF', got '}' at position 9: gt:19000}̲,"or":[{“sex”:“女”},{“address”:“延安”}]})
db.getCollection('employee').find({"age":{$lt:30},"address":"郑州"})db.employee.find({"age":{$lt:30},"address":"郑州"})
//查询age小于30并且地址是郑州的document
db.employee.find({'$and':[{"age":{$lt:30}},{"address":"郑州"}]}) db.getCollection('employee').find({})
//查询age小于30或address是洛阳document
db.employee.find({'$or':[{"age":{$lt:30}},{"address":"洛阳"}]})
//查询sex为女或address是南京的document
db.employee.find({'$or':[{"sex":"女"},{"address":"南京"}]})
// (price>70 and (publish="机械工业出版社" or public="新疆儿童出版社"))
db.db_book.find({"price":{$gt:70},'$or':[{"publish":"机械工业出版社"},{"publish":"新疆儿童出版社"}]})
八、模糊查询
- /内容/
- /^以什么开头/
- /以什么结尾$/
name中含有蒋字的
db.employee.find({“name”:/蒋/})
name中以马字开头的
db.employee.find({“name”:/^马/})
name中以依字结尾的
db.employee.find({“name”:/依$/})
九、删除文档
db.集合名.remove({指定条件})
db.employee.remove({_id:1002}) 删除_id为1002的文档
db.集合名.remove(删除条件,1)
db.employee.remove({name:/诸/},1) 删除名字中有诸的,并且只删除一个文档
name中以依字结尾的
db.employee.find({“name”:/依$/})