简介
关系型数据库里面全都是表
MongoDB是非关系型数据库(NOT ONLY SQL)
MongoDB也是文档型数据库,里面的数据模型是面向文档的,文档是一种类似JSON的结构,即MongoDB中全是增强版的JSON结构
先配置环境变量
在这里创建一个放数据的目录
这里另外用cmd输入mongo正式今日mongodb数据库
mongodb需要两步启动的解释
数据库可分为两部分:
- 数据库服务器:用于储存数据
mogod用于启动服务器 - 数据库客户端:客户端用于操作服务器,对数据进行增删改查操作
mongo用于启动客户端
所以要先启动服务器才能用客户端
这就是客户端,一个mongo shell
基本概念
- 文档(document) 在MongoDB中每条数据都是一个文档,是MongoDB中的最小单位,存储和操作的内容都是文档,增删改查都是文档
- 集合(collection) 集合是一组文档,也就是集合用来存放文档的;集合中存放的文档可以是各种各样的,没有形式要求
- 多个文档组成集合,多个集合组成数据库
- 在MongoDB中,集合和数据库都不需要手动创建,当我们创建文档时,如果文档所在集合或数据库不存在,会自动创建数据库和集合
基本操作
- 查看数据库
- 进入指定数据库
use 数据库名称
自动创建并进入了数据库test - db查看当前所处数据库
- 查看数据库中的集合
这里数据库中没有集合
数据库CRUD(增删改查)操作
doc代表document
- 向数据库中插入文档
- db.collection.insert(doc) 向集合中插入一个文档 collection处是集合名
例子:向test数据库中stus集合插入一个新的学生对象
{name:“张三”,age:18,gender:“男”}
- 查询 db.collection.find() 查询当前集合中的所有文档
插入文档(使用图形化操作界面)
- db.collection.insert() 向集合中插入一个或多个文档
- 插入多个数据
db.stus.insert([
{name:"tangseng",age:39,gender:"male"},
{name:"xiaowang",age:39,gender:"male"},
{name:"xiaoli",age:39,gender:"male"}
])
从结果可知多了一行_id
当我们向集合中插入文档时,如果没有给文档指定_id属性,则数据库会自动为文档添加_id,_id作为文档的唯一标识
ObjectId()自动生成当前id
_id作用是确保文档的唯一性。即确保数据的唯一性
_id可以以自己指定,数据库不会再给我们添加,也必须确保唯一性
- db.collection.insertOne()插入一个文档对象
- db.collection.insertMany()插入多个文档对象
这两个比insert()会清晰一点,但用哪个都行
查询文档
查询通用操作为 db.collection.find()
- find()用于查询集合中所有符合条件的文档
- find()可以接受一个对象作为条件参数 {} 表示查询集合中所有文档
{属性:值} 查询属性是指定值的文档
具体用法:查询_id的值为1的文档
db.stus.find({_id:1})
db.collection.findOne()
用于查询集合中符合条件的第一个文档,前面的find()是有几个就查几个
findOne()返回的就是一个文档对象
而find()返回的是一个数组,
可以用中括号取值,比如[0]取第一个
而findOne()可以用.属性名来取值
find()不可以这样做,因为是数组
mongodb支持直接通过内嵌文档的属性值进行查询
db.test2.insert({
name:"liu",
hobby:{
movies:['movie1','movie2'],
cities:['zhuhai','chengdu']
}
});
或者用查询db.test2.find({"hobby.movies":'movie1'})
.count可用于查询所有结果的数量
插入100条数据
for(var i=0;i<100;i++){
db.users.insert({username:'data'+i})
}
db.users.find().count()//100
length()也可实现类似效果
但length()和count()内部是不一样的,习惯使用count()
查询操作符
比较操作符
- $gt 大于
- $gte 大于等于
- $lt 小于
- $lte 小于等于
- $ne 不等于
- $eq 等于的另一种写法
文档的修改
替换:db.collection.update(查询条件,新对象)
原数据如下:
把tangseng的年龄改成10
db.stus.update({name:"tangseng"},{age:10});
重新看集合中文档数据:
就只剩age有数据
这是因为update()默认会使用新对象替换旧对象
修改操作符
修改操作符:修改指定的属性,而不是替换
- $set 可用于修改文档中的指定属性
可以见到name:"shazeng"已经加进去了
- $unset 可以用来删除文档的指定属性
这里address后跟什么值都可以,删除的是address这个属性
注意update默认只改一个
同时修改多个符合条件的文档
db.collection.updateMany()
修改一个符合条件的文档
db.collection.updateOne()
和默认情况一样
但其实update()也可以修改多个
db.stus.update(
{"name" : "zhubajie"},
{
$set:
{
address:"hahaha"
}
},
{
multi:true
}
);
替换一个文档
db.cpollection.replaceOne() 用于替换一个文档
文档的删除
- db.collection.remove()
- db.collection.deleteOne()
- db.collection.deleteMany()
数据准备如下:
删除id为1的文档
remove()根据条件来删除文档,传递条件的方式和find()一样
db.stus.remove({_id:1});
注意: remove()默认情况会删除符合条件的所有文档
remove()删除一个文档的方法
如果remove() 第二个参数传递一个true,则只会删除一个
删除第一个age为39的文档
db.stus.remove({age:39},true);
remove({})会删除所有
空对象作为参数会删除集合中所有文档
清空集合,但性能差,因为是一个个删(先匹配再删除)
若要删除数据,则最好的方法是在数据中多加一个字段来表示该数据是否被删除,而不是真的删除数据