来源
开发环境
| 名称 | 版本 |
|---|---|
| 操作系统 | Windows 10 X64 |
| MongoDB | 3.2.4 X64 |
MongoDB 文档地址
https://www.mongodb.com/docs/manual/reference/insert-methods/
MongoDB 简介
● MongoDB 是为快速开发互联网 Web 应用而设计的数据库系统。
● MongoDB 的设计目标是极简、灵活、作为 Web 应用栈的一部分。
● MongoDB 的数据模型是面向文档的,所谓文档是一种类似于 JSON 的结构,简单理解 MongoDB 这个数据库中存的是各种各样的 JSON。(BSON)
MongoDB 下载
● 下载地址:
https://www.mongodb.org/dl/win32/
https://www.mongodb.com/download-center/community
● MongoDB 的版本偶数版本为稳定版,奇数 版本为开发版。
● MongoDB 对于 32 位系统支持不佳,所以 3.2 版本以后没有再对 32 位系统的支持。
这里我下载 mongodb-win32-x86_64-2008plus-ssl-3.2.4-signed.msi
MongoDB 安装
运行 mongodb-win32-x86_64-2008plus-ssl-3.2.4-signed.msi,一直下一步即可。
这里我的安装目录是 D:\Program Files\MongoDB
MongoDB 启动
● 配置环境变量,注意这里是安装目录的 bin 目录
| 环境变量 | 值 |
|---|---|
MongoDB |
D:\Program Files\MongoDB\Server\3.2\bin |
Path |
添加到最后 ;%MongoDB%; |
● 第一种启动方式:使用默认的数据库路径和端口号启动
1.创建文件夹 C:\data\db
2.打开命令行窗口,输入 mongod,此窗口不关闭
● 第二种启动方式:指定数据库路径和端口号启动
1.创建文件夹 D:\Data\DB
2.打开命令行窗口,输入 mongod --dbpath D:\Data\DB --port 27017,此窗口不关闭
● 重新开启一个命令行窗口,输入 mongo,启动成功
MongoDB 设置为 Windows 服务并自启动
注意:
4.x及以上版本已经自启动,不需要设置参考:https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/
● 创建两个目录
D:\Data\DBD:\Data\Log
● 创建配置文件 D:\Program Files\MongoDB\Server\3.2\mongod.cfg
systemLog:destination: filepath: D:\Data\Log\mongod.logstorage:dbPath: D:\Data\DB
● 根据配置文件路径修改命令
语法:
sc.exe create MongoDB binPath= "\"mongo bin路径\mongod.exe\" --service --config=\"mongo路径\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
修改后的命令为:
sc.exe create MongoDB binPath= "\"D:\Program Files\MongoDB\Server\3.2\bin\mongod.exe\" --service --config=\"D:\Program Files\MongoDB\Server\3.2\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
● 管理员模式启动命令行
输入
sc.exe create MongoDB binPath= "\"D:\Program Files\MongoDB\Server\3.2\bin\mongod.exe\" --service --config=\"D:\Program Files\MongoDB\Server\3.2\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
● 启动服务
● 删除服务
如果服务启动失败,或者需要重新设置服务,需要先删除服务,再重新配置
sc delete MongoDB
● 关掉所有命令行窗口,重新开启一个命令行窗口,输入 mongo,启动成功
MongoDB 基本操作
来源:MongoDB 基本操作
三个概念
| 概念 | 描述 |
|---|---|
数据库(database) |
数据库是一个仓库,在仓库中可以存放集合。 |
集合(collection) |
● 集合类似于数组,在集合中可以存放文档。 ● 集合就是一组文档,也就是集合是用来存放文档的 ● 集合中存储的文档可以是各种各样的,没有格式要求 |
文档(document) |
● 文档数据库中的最小单位,我们存储和操作的内容都是文档。 ● 类似于JS中的对象,在 MongoDB 中每一条数据都是一个文档 |
● 多个文档组成集合,多个集合组成数据库
● 基本指令
| 指令 | 作用 |
|---|---|
show dbsshow databases |
显示当前的所有数据库 |
use 数据库名 |
进入到指定的数据库中 |
db |
db 表示的是当前所处的数据库 |
show collections |
显示数据库中所有的集合 |
● 向数据库中插入文档
语法
db.<collection>.insert(doc);
例子:向 test 数据库中的,stus 集合中插入一个新的学生对象
db.stus.insert({name:"孙悟空",age:18,gender:"男"});
● 查询当前集合中的所有的文档
语法
db.<collection>.find()
例子:查询 test 数据库中的 stus 集合中的文档
db.stus.find();
MongoDB 安装图形化工具
| 图形化工具 |
|---|
| Navicat |
| mongodbmanagerfree_inst |
| MongoChef |
这里我使用 Navicat 来进行连接。
MongoDB CURD
● 添加文档
来源:MongoDB 插入文档
/* 向数据库中插入文档时,如果没有给文档指定 _id 属性,数据库会自动为文档添加 _id,该属性用来作为文档的唯一标识 *//*插入单条数据*/db.stus.insert({name:"猪八戒1",age:28,gender:"男"});/*插入单条数据,指定 _id,如果自己指定 _id,必须确保它的唯一性*/db.stus.insert({_id:"1",name:"猪八戒4",age:28,gender:"男"});/*插入多条数据*/db.stus.insert([{name:"猪八戒2",age:28,gender:"男"},{name:"猪八戒3",age:29,gender:"男"}]);//17.向numbers中插入20000条数据 7.2sfor(var i=1 ; i<=20000 ; i++){db.numbers.insert({num:i});}db.numbers.find()db.numbers.remove({});//0.4svar arr = [];for(var i=1 ; i<=20000 ; i++){arr.push({num:i});}db.numbers.insert(arr);
● 查询文档
来源:MongoDB 查询文档
/*查询集合中所有符合条件的文档*/db.stus.find();db.stus.find({name:"猪八戒"});db.stus.find({name:"猪八戒",age:28});/*查询集合中所有符合条件的第一个文档*/db.stus.findOne({age:28});/*查询集合中所有符合条件的文档个数*/db.stus.find({age:28}).length();db.stus.find({age:28}).count();//18.查询numbers中num为500的文档db.numbers.find({num:500})//19.查询numbers中num大于5000的文档db.numbers.find({num:{$gt:500}});db.numbers.find({num:{$eq:500}});//20.查询numbers中num小于30的文档db.numbers.find({num:{$lt:30}});//21.查询numbers中num大于40小于50的文档db.numbers.find({num:{$gt:40 , $lt:50}});//22.查询numbers中num大于19996的文档db.numbers.find({num:{$gt:19996}});//23.查看numbers集合中的前10条数据db.numbers.find({num:{$lte:10}});//limit()设置显示数据的上限db.numbers.find().limit(10);//在开发时,我们绝对不会执行不带条件的查询db.numbers.find();//24.查看numbers集合中的第11条到20条数据/*分页 每页显示10条1-10 011-20 1021-30 20。。。skip((页码-1) * 每页显示的条数).limit(每页显示的条数);skip()用于跳过指定数量的数据MongoDB会自动调整skip和limit的位置*/db.numbers.find().skip(10).limit(10);//25.查看numbers集合中的第21条到30条数据db.numbers.find().skip(20).limit(10);db.numbers.find().limit(10).skip(10);//27.查询工资小于2000的员工db.emp.find({sal:{$lt:2000}});//28.查询工资在1000-2000之间的员工db.emp.find({sal:{$lt:2000 , $gt:1000}});//29.查询工资小于1000或大于2500的员工db.emp.find({$or:[{sal:{$lt:1000}} , {sal:{$gt:2500}}]});//30.查询财务部的所有员工//(depno)var depno = db.dept.findOne({dname:"财务部"}).deptno;db.emp.find({depno:depno});//31.查询销售部的所有员工var depno = db.dept.findOne({dname:"销售部"}).deptno;db.emp.find({depno:depno});//32.查询所有mgr为7698的所有员工db.emp.find({mgr:7698})
● 修改文档
来源:MongoDB 修改文档
/*db.collection.update(查询条件,修改对象);update() 默认情况下会使用新对象替换旧的对象。如果需要修改指定的属性,而不是替换,需要使用“修改操作符”$set 可以用来修改文档中的指定属性$unset 可以用来删除文档的指定属性//修改多条db.collection.updateMany()//修改单条db.collection.updateOne()//替换一个文档db.collection.replaceOne()*//*替换*/db.stus.update({age:33},{name:"猪八戒",age:28,gender:"男"});/*修改指定的属性*/db.stus.update({name:"猪八戒"},{$set:{age:30}});//删除username为sunwukong的文档的address属性db.users.update({username:"sunwukong"},{$unset:{address:1}});//11.向username为sunwukong的文档中,添加一个hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}//MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做 内嵌文档db.users.update({username:"sunwukong"},{$set:{hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}}});//12.向username为tangseng的文档中,添加一个hobby:{movies:["A Chinese Odyssey","King of comedy"]}db.users.update({username:"tangseng"},{$set:{hobby:{movies:["A Chinese Odyssey","King of comedy"]}}})db.stus.find({name:"猪八戒"});//14.向tangseng中添加一个新的电影Interstellar//$push 用于向数组中添加一个新的元素//$addToSet 向数组中添加一个新元素 , 如果数组中已经存在了该元素,则不会添加db.users.update({username:"tangseng"},{$push:{"hobby.movies":"Interstellar"}});db.users.update({username:"tangseng"},{$addToSet:{"hobby.movies":"Interstellar"}});db.users.find();//33.为所有薪资低于1000的员工增加工资400元db.emp.updateMany({sal:{$lte:1000}} , {$inc:{sal:400}});
● 删除文档
来源:MongoDB 删除文档
/* 删除符合条件的所有文档,第二个参数为 true,则只删除一个文档如果只传递一个空对象 {},会删除所有数据*/db.stus.remove({_id:"1"},true);/* 删除集合*/db.stus.drop();/* 删除符合条件的第一条文档 */db.stus.deleteOne({name:"猪八戒"});/* 删除符合条件的所有文档 */db.stus.deleteMany({name:"猪八戒"});db.stus.find();
MongoDB 排序,投影(查询指定列)
● 排序
/*排序sort()可以用来指定文档的排序规则1:升序,-1:降序age:-1,按 age 降序name:1,按 name 升序*/db.stus.find({}).sort({age:-1,name:1});
查询结果
// 1{"_id": ObjectId("6451ba460206460b6c0008e4"),"name": "猪八戒2","age": 29,"gender": "男"}// 2{"_id": ObjectId("6451ba460206460b6c0008e3"),"name": "猪八戒1","age": 28,"gender": "男"}// 3{"_id": ObjectId("6450fc2e549310a96276d1ab"),"name": "孙悟空","age": 18,"gender": "男"}
● 投影(查询指定列)
/*投影1:显示,0:不显示*/db.stus.find({},{name:1,age:1,_id:0});
查询结果
// 1{"name": "孙悟空","age": 18}// 2{"name": "猪八戒1","age": 28}// 3{"name": "猪八戒2","age": 29}
MongoDB 文档之间的关系
一对一
● 一对一关系
/*一对一:在 MongoDB ,可以通过内嵌文档形式体现出一对一的关系*/db.wifeAndHusband.insert([{name:"黄蓉",hasband:{name:"郭靖"}},{name:"潘金莲",hasband:{name:"武大郎"}}]);db.wifeAndHusband.find();
● 查询结果
// 1{"_id": ObjectId("6451d4e90206460b6c005705"),"name": "黄蓉","hasband": {"name": "郭靖"}}// 2{"_id": ObjectId("6451d4e90206460b6c005706"),"name": "潘金莲","hasband": {"name": "武大郎"}}
一对多/多对一
● 一对多关系-用户
/*一对多/多对一可以通过内嵌文档形式体现出一对多的关系*/db.users.insert([{username:"孙悟空"},{username:"猪八戒"}]);db.users.find();
查询结果:
// 1{"_id": ObjectId("6451da320206460b6c005709"),"username": "孙悟空"}// 2{"_id": ObjectId("6451da320206460b6c00570a"),"username": "猪八戒"}
● 一对多关系-用户订单
db.order.insert({list:["苹果","香蕉","梨"],user_id:ObjectId("6451da320206460b6c005709")});db.order.insert({list:["西瓜","牛肉"],user_id:ObjectId("6451da320206460b6c00570a")});db.order.insert({list:["西瓜","漫画"],user_id:ObjectId("6451da320206460b6c00570a")});db.order.find();
● 查找孙悟空的订单
//查找孙悟空的订单var userid = db.users.findOne({username:"孙悟空"})._id;db.order.find({user_id:userid});
● 查询结果
// 1{"_id": ObjectId("6451da430206460b6c00570b"),"list": ["苹果","香蕉","梨"],"user_id": ObjectId("6451da320206460b6c005709")}
多对多
● 老师
/*多对多*/db.teachers.insert([{name:"老师1"},{name:"老师2"},{name:"老师3"},]);db.teachers.find();
// 1{"_id": ObjectId("6451dcd20206460b6c00570e"),"name": "老师1"}// 2{"_id": ObjectId("6451dcd20206460b6c00570f"),"name": "老师2"}// 3{"_id": ObjectId("6451dcd20206460b6c005710"),"name": "老师3"}
● 学生对应的老师
db.stus.insert([{name:"学生1",tech_ids:[ObjectId("6451dcd20206460b6c00570e"),ObjectId("6451dcd20206460b6c00570f")]}]);db.stus.find();
● 查询结果
// 1{"_id": ObjectId("6451dd750206460b6c005711"),"name": "学生1","tech_ids": [ObjectId("6451dcd20206460b6c00570e"),ObjectId("6451dcd20206460b6c00570f")]}