【MongoDB】入门-实验楼篇
本地没有安装MongoDB可以在实验楼上学习的
地址:实验楼
虚拟机开机配置
启动 MongoDB 服务,因为 MongoDB 并不随系统一起启动,可能以下命令运行后会等一小段的时间才会启动完毕。
sudo service mongodb start
进入 MongoDB 命令行操作界面(可能会出现 connect failed,多试几次就行),在命令行中敲 exit 可以退出。
mongo
实验中的布尔类型的 ture 用 1 代替,false 用 0 代替。
基本概念
数据库
一个 MongoDB 可以创建多个数据库
使用 show dbs 可以查看所有数据库的列表
执行 db 命令则可以查看当前数据库对象或者集合
运行 use 命令可以连接到指定的数据库
$ mongo # 进入到mongo命令行
use test # 连接到test数据库
注意:数据库名可以是任何字符,但是不能有空格、点号和 $ 字符。
集合
集合就是一组文档的组合,就相当于是关系数据库中的表,在 MongoDB 中可以存储不同的文档结构的文档。
例如:
{"company":"Chenshi keji"} {"people":"man","name":"peter"}
上面两个文档就可以存储在同一个集合中,在关系型数据库中是很难实现上述数据结构的,要么需要定义大量的字段,对于一些字段名不确定的属性,关系型数据库会更加力不从心。
MongoDB 的做法也不是完美的。比如在存储用户信息的时候,用户名和密码分别用 username 和 password 字段表示。 关系型数据库只需要把字段名作为表结构的一部分保存起来就可以了,而 MongoDB 需要将这两个字段名存储多次,每一条记录都会存储一次字段名,在一些原本就比较碎片化的字段上,用于存储字段名所耗费的空间甚至会超过存储数值的空间,比较好的解决办法是采用尽可能短的字段名,不过这又涉及到了可读性的问题,需要大家在二者之间进行权衡。
文档
文档是 MongoDB 的核心,类似于 SQLite 数据库(关系数据库)中的每一行数据。多个键及其关联的值放在一起就是文档。在 Mongodb 中使用一种类 json 的 bson 存储数据,bson 数据可以理解为在 json 的基础上添加了一些 json 中没有的数据类型。
文档逻辑体系
假设有两个文档
# user文档
{
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991"
}
# address文档
{
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "chengdu",
"state": "sichuan"
}
嵌入
# 这就是嵌入式的关系
{
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991",
"address":
[{
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "chengdu",
"state": "sichuan"
},
{
"building": "170 A, Acropolis Apt",
"pincode": 456789,
"city": "beijing",
"state": "beijing"
}]
}
引用
# 这就是引用式关系
{
"name": "Tom Benzamin",
"contact": "987654321",
"dob": "01-01-1991",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000") #对应address文档的id字段
]
}
在实际应用的时候,嵌入式关系比较适合一对一的关系,引用式关系比较适合一对多或者多对多的情况。
元数据
数据库的信息存储在集合中,他们统一使用系统的命名空间:DBNAME.system.*。
DBNAME 可用 db 或数据库名替代:
DBNAME.system.namespaces :列出所有名字空间
DBNAME.system.indexs :列出所有索引
DBNAME.system.profile :列出数据库概要信息
DBNAME.system.users :列出访问数据库的用户
DBNAME.system.sources :列出服务器信息
数据库的创建与销毁
进入mongo操作界面
mongo
使用use进入某个数据库亦或创建数据库
use db-name
查看当前连接数据库
db
查看所有数据库
show dbs
PS:
mongodb数据库不显示空的数据库
所以这里并没有显示
销毁数据库
销毁数据库 记得先使用 use指令进入数据库先
例如 use db-name
db.dropDatabase()
验证 查看
show dbs
销毁数据库
集合创建和删除
创建集合
先进入数据库
use 数据库名
use mydb
使用db的createCollection("集合名称") 创建集合
db.createCollection("users")
> db.createCollection("shiyanlou") #无参数
{ "ok" : 1 }
> show collections
shiyanlou
system.indexes
> db.createCollection("shiyanlou2", { capped : 1, autoIndexId : 1, size : 6142800, max : 10000 } ) #带参数
{ "ok ": 1 }
创建集合
显示所有集合
show collections
显示所有集合
删除集合
# 先显示所有的集合
show collections
# db.集合名称.drop()
db.users.drop()
# 验证结果
show collections
删除集合
文档
向集合中插入文档
insert
inset语句 如果你要插入多条就要用 []数组的形式
插入一条则使用{}就可以了
db.users.insert([ { name : "jam", email : "jam@qq.com" }, { name : "tom", email : "tom@qq.com"} ])
插入文档
还可以这样插入文档
> userdoc1=({"user_id":1,"name":"cloud","state":"active","actor":"user","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-12","hour":"10:53 PM"}] })
> userdoc2=({"user_id":2,"name":"testadmin","state":"active","actor":"admin","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-11","hour":"06:34 AM"}] })
> doc1=({"name":"peter","position":"teacher"}) #先定义文档
> use Chenshi
switched to db Chenshi
> db.shiyanlou.insert(userdoc1)
WriteResult({"nInserted":1})
> db.shiyanlou.insert(userdoc2)
WriteResult({"nInserted":1})
> db.shiyanlou.insert(doc1)
WriteResult({"nInserted":1})
save
db.users.save([ { name : "jam", email : "jam@qq.com" },{ name : "tom", email : "tom@qq.com"} ])
更新文档
使用 db.collection_name.update({条件}, {$set:{设置的值}})
> db.shiyanlou.update({"user_id":2,"e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}})
WriteResult({"nMatched":1,"nUpserted":1,"nModified":1})
> db.shiyanlou.find()
默认的 update 函数只对一个文档更新,如果想作用所有文档,则需要加入 multi:true
db.shiyanlou.update({"e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}},{multi:true})
替换数据
使用save
其实save 跟insert语句差不多
但是save更加好用
语法:db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})
操作实例:
> db.shiyanlou.save({"_id":ObjectId("53ea174ccb4c62646d9544f4"),"name":"Bob","position":"techer"})
WriteResult({"nMatched":1,"nUpserted":1,"nModified":1})
删除文档
使用remove语句
括号里头是查找条件
语法:db.COLLECTION_NAME.remove(DELECTION_CRITERIA)
操作实例:
> db.shiyanlou.remove({"name":"Bob"})
WriteResult({"nRemoved":1})
查找数据
查询语句
数据准备
前提是开启了mongodb的服务
进入mongo操作
> use school
> db.student.insert([
{
name: '洪宏鸿',
age: 25,
sex: 1,
pass: '825'
},
{
name: '洪金宝',
age: 50,
sex: 1,
pass: '123'
},
{
name: '洪小玲',
age: 40,
sex: 0,
pass: '369'
}
])
查询find
格式为 db.集合名称.find()
find 不加任何参数返回所有的记录
db.student.find()
加上pretty()方法可以让你的输出美化
美化
如果你想让 mongo shell 始终以 pretty 的方式显示返回数据,可以通过下面的指令实现
echo "DBQuery.prototype._prettyShell = true" >> ~/.mongorc.js
当我退出mongo命令之后
之前打的数据就没了 坑呀。。。只好重新插入数据
重插数据好在结果没让我失望
重插结果
and
find 操作默认的动作就是and
如果你直接把条件加到bson格式的对象中
那就是用and去查找数据
例如
db.student.find({"name": "hong", "pass": "825"})
and条件
相当于
关系性数据库中
select * from student where name='hong' and pass = '825'
or
or操作使用 $or 操作符
查找格式如下:
db.student.find(
{
$or : [
{"name" : "hong"},
{"pass" : "825"}
]
}
)
相当于
select * from student where name='hong' or pass = '825'
or条件
and 结合 or
db.student.find(
{
"age": {$gt:21}
$or : [
{"name" : "hong"},
{"pass" : "825"}
]
}
)
{$gt:10}
表示大于 10,另外,$lt
表示小于、$gte
表示大于等于、$lte
表示小于等于、$ne
表示不等于。
如果这样的符号记起来稍微有点麻烦,可以根据它们的全写配合记忆:
-
gt
:大于 greater than -
lt
:小于 less than -
gte
:大于或等于 greater than equal -
and or 结合lte
:小于或等于 less than equal
正则
使用 // 形式进行匹配
正则