一、简介
在关系型数据库中,表的设计完成后,不能改动,因此在项目开发过程中,很被动。因此使用非关系型数据库MangoDB,表的结构可以改变。
BSON:增强版JSON,可以存储二进制数据。
二、安装及启动
- 版本说明,偶数为稳定版,例如3.2,3.4。
- 配置环境变量,将mongo安装包的bin目录添加到path里。4.x版本后不需要此操作。
- 启动,在cmd输入 mongod,启动服务器。
- 将MongoDB设为系统服务,开机自动启动。
注意: 4.x版本不需要此项操作
设置系统服务步骤
mongod.cfg文件的内容:
systemLog:
destination: file
path: c:\data\log\mongod.log
storage:
dbPath: c:\data\db
cmd执行的命令
sc.exe create MongoDB binPath= "\"D:\MongoDB\Server\3.2\bin\mongod.exe\" --service --config=\"C:\Program Files\MongoDB\Server\3.2\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
三、概念
3.1 MongoDB 结构
- 类比关系型数据库
在MongoDB中数据库database
表示一个数据库,集合collection
相当于关系型数据库的表,文档document
相当于关系型数据库的一行记录.文档document是以二进制json
的形式存储在数据库中的,是我们直接操作的对象.
3.2 结构关系图
3.3 cmd命令
数据库和文档无需手动建立
-
显示所有数据库
show dbs
-
对某各数据库进行操作
use 数据库名
-
当前数据库
db
-
显示数据库中所有集合
show collections
-
查询当前集合所有文档
db.集合名.find()
四、数据库增删改查(CRUD)操作
4.1 插入文档
-
使用
db.集合名.insertOne()
向集合中添加一个文档,参数一个json格式的文档 -
使用
db.集合名.insertMany()
向集合中添加多个文档,参数为json文档数组 -
使用
db.集合名.insert()
向集合中添加一个或多个文档
// 向stus集合中添加一个文档
db.stus.insertOne(
{ name: "mio", age: 10 , size: { h: 160, w: 50 }}
)
// 向stus集合中添加多个文档
db.stus.insertMany([
{ name: "mio", age: 10 , size: { h: 160, w: 50 }},
{ name: "mio2", age: 10 , size: { h: 160, w: 50 }},
{ name: "mio3", age: 10 , size: { h: 160, w: 50 }}
])
-
插入2000条文档
方式一:执行插入插座2000次for(var i=1;i<=2000;i++){ db.number.insert({num:i}) }
方式二:一次性插入2000条记录
var arr = []; for(var i=1;i<=2000;i++){ arr.push({num:i}); } db.number.insert(arr);
4.2 查询文档
1.按条件查询
-
查询操作符
-
查询集合中符合条件的所有文档:使用
db.集合名.find()
#在stus中查询所有文档 db.stus.find()
-
查询集合中符合条件的所有文档:使用
db.集合名.find({属性:值})
#在stus中按姓名查询 db.stus.find({name:'mio'})
-
使用
db.集合名.find({属性:值, 属性:值})
方法对集合进行查询#在stus中按姓名和年龄查询 db.stus.find({name:'mio',age:18})
-
查询集合中符合条件的第一条文档对象:使用
db.集合名.findOne({属性:值})
#在stus中按姓名查询 db.stus.findOne({name:'mio'})
-
find返回的是一个数组,可以用[ 0 ] 表示要取的第几条记录
# 取一个元素 db.stus.find({name:'mio'})[0]
-
findOne返回的是一个对象,可以直接
.属性名
db.stus.findOne({name:'mio'}).name
-
查询有多少个文档,
db.集合名.find().count()
db.stus.find().count()
-
在number(集合名)中查值大于500的文档
db.number.find({num:{$gt:500}})
-
在number(集合名)中查值大于1900,小于1999的文档
db.number.find({num:{$gt:1990,$lt:1999}})
-
在number(集合名)中查值大于1900或者小于1999的文档
db.number.find({$or:[{num:{$gt:1990}},{num:{$lt:20}}]})
-
查询
number
前十条数据,limit()设置显示上限db.number.find().limit(10)
-
查询
number
11到20条数据,skip()用于跳过指定数量的数据db.number.find().skip(10).limit(10)
2.将查询结果排序
-
db.集合名.find().sort(属性:条件,属性:条件)
,按属性进行排序,条件值为1
表示升序,为-1
表示降序。可指定多个排序规则db.number.find().sort({num:1})
3.仅显示部分属性
-
用
db.集合名.find({ },{ 属性值:1})
,find
里两个对象,第一个表示查询条件,第二个表示想显示的字段。1
表示显示,0
表示不显示,db.stus.find({},{name:1,_id:0})
4.3 修改文档
- 如果要修改属性,需要‘
修改操作符’
来完成修改 $set
:修改文档中指定属性$unset
:删除文档指定属性$push
:向数组中添加一个元素$addToSet
:向数组中添加一个元素,该元素必须是数组中没有的,set中元素不能重复$inc
:在原来基础上增加
1.修改属性
# 将collection中将文档按'属性1'的条件1查询
# 然后将"属性2","属性3"的值修改
db.集合名.updateOne(
{ "属性1": 条件1 },
{
$set: { "属性2": 条件2, "属性3": 条件3},
}
)
# 将name名为‘mio’的人的年龄改成66
db.stus.update({name:'mio'},{$set:{age:66}})
结果图:
2.删除属性
# 将collection中将文档按'属性1'的条件1查询
# 然后将"属性2"值删除
db.集合名.updateOne(
{ "属性1": 条件1 },
{
$unset: { "属性2": 1},
}
)
# 将name为mio的age属性删除
db.stus.update({name:'mio'},{$unset:{age:1}})
结果图:
-
使用
db.集合名.updateOne(<filter>, <update>, <options>)
方法修改一个匹配条件的文档 -
使用
db.集合名.updateMany(<filter>, <update>, <options>)
方法修改所有匹配条件的文档注意: updateMany将符合条件的全部修改
db.集合名.updateMany( { "属性1": 条件1 }, { $set: { "属性2": 条件2}, } )
db.stus.updateMany({name:'mio'},{$set:{age:66}})
如图:将name为mio的两条记录的age都修改为66
注意:update
有个参数,可设置为修改多个还是一个;update默认只修改一个,如果有多个符合条件的,只修改第一个db.集合名.updateOne( { "属性1": 条件1 }, { $set: { "属性2": 条件2, "属性3": 条件3}, }, { multi:True } )
db.stus.update({name:'mio'},{$set:{age:66}},{multi:true})
如图:将name为mio的两条记录的age都修改为88
- 使用
db.集合名.replaceOne()
方法替换除属性1外的所有属性,其<update>
参数应为一个全新的文档.
3.内嵌文档
当一个文档的属性是文档时,我们称这个属性为内嵌属性。
新增一个文档为hobby
的的文档:
db.stus.update({name:'mio2'},{$set:{hobby:{cities:['beijing','shanghai'],movies:['hero']}}})
MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档可以通过·的形式来匹配,但属性必须使用引号。
db.stus.find({'hobby.movies':'hero'})
向name
为mio
的movies
里新增一个电影,使用数组修改操作符‘$push’
db.stus.update({name:'mio2'},{$push:{'hobby.movies':'haha'}})
结果图:
向name
为mio
的movies
里新增一个电影,使用数组修改操作符‘$addToSet’
db.stus.update({name:'mio2'},{$addToSet:{'hobby.movies':'haha'}})
结果会添加失败,因为该数组中已经有haha
4.4 删除文档
注意:一般数据库数据不会真正删除,通常情况会添加一个字段‘isDelete’,默认为0,即没有删除;若想要删除该条数据时,将‘isDelete’修改为1。在显示的时候,添加一个条件,
{isDelete:0}
-
db.集合名.remove()
可以删除一个或多个符合条件的文档,默认删除多个。remove()第二个参数设置为true
,则只会删除一个。# 此时会删除所有名字是mio的文档 db.stus.remove({name:mio}) # 此时会删除一个名字是mio的文档 db.stus.remove({name:mio},true)
结果图:
-
db.集合名.deleteOne()
可以删除一个符合条件的文档。 -
db.集合名.deleteMany()
可以删除多个符合条件的文档。 -
db.集合名.remove({})
,清空集合,性能略差 -
db.集合名.drop()
,删除集合 -
db.dropDatabase()
,删除数据库