第一步:下载,mongoDB(64位)下载地址:MongoDB下载路径
第二步:安装,windows版的安装,就像安装一般的软件一样进行next进行安装,安装步骤可以参照:mongodb安装
第三步:配置环境,mongodb需要配置环境变量:
我的的安装路径是 D:\Program Files (x86)\MongoDB\bin
计算机,右键—选择属性——选择高级系统设置——选择环境变量——选择path——编辑
将自己的地址加入到环境变量中。
第四步:在c盘的根目录下创建一个data文件夹,在文件夹中创建一个db文件夹,在启动时可以指定位置,不一定需要在c盘路径下
开启指定数据库路径:mongod –dbpath D:\data\db
开启时指定端口号:mongod –dbpath D:\data\db –port 10021
第五步:测试,win+r打开命令行,cmd中输入mongod,启动服务器。
第六步:连接服务器,重新启动命令窗口输入mongo,连接服务器
设置mongodb为系统服务,不需要手动启动。
步骤一:在之前的data文件夹下创建log文件夹
步骤二:在自己的安装路径下创建一个配置文件
D:\Program Files (x86)\MongoDB\mongod.cfg
配置文件中写入:
systemLog:
destination: file
path: c:\data\log\mongod.log
storage:
dbPath: c:\data\db
步骤三:管理员身份开启命令行工具
步骤四:执行以下的命令
mongod.exe –logpath C:\data\log\mongodb.log –logappend –dbpath C:\data\ –directoryperdb –serviceName MongoDB –install
在服务中可以看到MongoDB服务启动起来将其设置为手动启动
如果出错后将c盘中的data中的文件进行清理,重新开始设置。
MongoDB中的三个概念:
数据库(database):数据库是一个仓库,在仓库中可以存放集合
集合(collection):集合中可以存放文档
文档(document):文档是mongodb中的最小单位
基本的指令:
1.显示所有的数据库:show dbs
2.进入一个数据库:use 数据库名(也可以不存在,使用时创建)
3.查看当前所处的数据库 :db
- 查看数据库中所有的集合 : show collections
数据库CRUD操作
db.<collection名>.insert(doc)
<!--举例,向test数据库中插入一个学生对象-->
db.stus.insert({name:"张三",age:10,sex:"男"});
<!--查看数据库-->
show dbs
<!--查看集合-->
show collections
<!--查看文档-->
db.集合名.find()
数据库管理工具的安装:
我的网盘有安装包:链接:https://pan.baidu.com/s/1pjb6y-Yq99Dy_-uL1fhS8Q
提取码:8ns4
安装如果出现问题:可以将软件进行更新重新安装。
点击软件中的help——选择check for updates…自动下载罪行的工具,安装好之后就可以进行使用了
管理工具更改字体:
新增数据:
/*
*新增数据:新增一条数据和新增多条数据,多条数据添加时是一个数组的形式
*/
db.stus.insert({name:"xing",age:20,sex:"男"});
db.stus.insert([{name:"xing",age:20,sex:"男"}
,{name:"han",age:18,sex:"女"},
{name:"chen",age:24,sex:"女"}
]);
/*
*自动产生一个_id,保证每个文档或对象唯一,该字段也可以自动以产生,但是必须暴增其唯一性
*/
ObjectId();
//新增一条数据insertOne()和新增多条数据,只传入数组insertMany()
db.collection.insertOne();
db.collection.insertMany();
查询数据:
/*
*查询数据
* db.collection.find();
* 查询集合中符合条件的文档,可传可不传,不传时查询所有
*db.collection.find({字段名:值});
*/
db.stus.find({name:"xing"});
db.stus.find({age:24});
db.stus.find({name:"han",age:18});
//db.collection.findOne({属性名:属性值}) 查找文档中的符合条件的第一个数据,返回的是文档对象
//find()查询结果为数组,可以获取数组中的对象元素
db.stus.find({name:"xing"})[0].name;
//查询满足条件的记录条数
db.stus.find({name:"xing"}).length();
修改数据:
/*
* 修改数据
* db.collection.update(查询条件,新对象);
* 该语句会将满足条件的对象全部替换成新对象,不常用
* 只更改对象的部分属性
* db.collection.update(查询条件,{$set:{新对象}});
* 删除对象的某一个属性
* db.collection.update(查询条件,{$unset:{新对象}});
* updateOne()
* 修改多个符合条件的文档,update默认只改变满足条件的第一个文档,
* 使用以下语句将符合条件的都进行更改
* db.collection.updateMany(查询条件,{$set:{新对象}});
* 根据参数multi设置update方法,修改单个数据或多个数据
* 替换方法replaceOne()
*/
db.stus.update({name:""},{name:"xing",age:21,sex:"男"});
db.stus.find();
//只改变单个属性的值
db.stus.update({name:"xing"},{$set:{age:23}});
//设置一个不存在的列,相当于给文档对象添加一个列
db.stus.update({name:"xing"},{$set:{addr:"shanxi"}});
//删除addr列
db.stus.update(
{name:"xing"},
{$unset:{addr:"shanxi"}}
);
//设置多个数据
db.stus.update(
{name:"xing"},
{$set:{addr:"shanxi"}},
{multi:true}
);
删除数据:
/*删除数据 必须传递参数,如果传入{}表示全部删除
* db.collection.remove();默认删除多个
* db.collection.removeMany();
* db.collection.removeOne();
*/
db.stus.find();
db.stus.remove({name:"xing"});
//删除一个
db.stus.remove({age:20},true);
//删除所有,性能比较差
db.stus.remove({});
show collections;
//删除集合,
db.stus.drop();
练习一:
//1.进入my_test数据库
use my_test
//向数据库中的user集合中插入一个文档
db.users.insert([
{name:"xing",age:15},
{name:"hahah",age:18}
]);
//查询user集合中的文档
db.users.find();
//向数据库中的user集合中插入一个文档
db.users.insert([
{name:"lalal",age:15}
]);
//统计数据库user集合的文档数量
db.users.find().count();
//查询数据库users集合中的username为xing的文档
db.users.find({name:"xing"});
//向数据库users集合中的username为xing的文档添加一个addr属性,值为xian
db.users.update({name:"xing"},{$set:{addr:"xian"}});
//使用username:"tang"替换username:“xing”
db.users.replaceOne({name:"xing"},{name:"tang"});
//删除username为xing的addr属性
db.users.update({name:"xing"},{$unset:{addr:"xian"}});
//向username为xing的文档中,添加一个hobby:{cities:["beijign","shanghai","shenzhen"],movies:["huan","pian"]}
//当一个文档的属性的值是一个文档时,称为内嵌文档
db.users.update({name:"xing"},{$set:{hobby:{cities:["xian","beijing","sanghai"],movies:["huan","pian"]}}});
//向username为tang的文档中,添加一个hobby:{movies:["chinese","King"]}
db.users.update({name:"tang"},{$set:{hobby:{movies:["chinese","King"]}}});
//查询喜欢电影为huan的文档,mongodb支持通过内嵌文档进行查询,如果查询内嵌文档,可以通过.的形式
//如果通过内嵌文档查询时,需要对属性是使用引号(单引号和双引号均可)
db.users.find({'hobby.movies':"huan"});
//向tang中添加一个新的电影Interstellar,内嵌文档的新增数据,使用的是$push操作符
//向数组中添加元素$push,还有一种操作,$addToSet,区别是,set添加时数组中已经有该元素则添加失败
db.users.update({name:"tang"},{$push:{"hobby.movies":"Interstellar"}});
//删除喜欢beijing的用户
db.users.remove({"hobby.cities":"beijing"});
//删除users集合
db.users.remove({});
//数据集合删除另一种方式
db.users.drop();
show dbs;
练习二:
//向numbers插入20000条数据
var arr = [];
for(var i = 1;i<=20000;i++){
arr.push({num:i});
}
db.numbers.insert(arr);
db.numbers.find();
//查询numbers中num为500的文档
db.numbers.find({num:500});
db.numbers.find({num:{$eq:500}});
//查询numbers中num大于5000的文档
db.numbers.find({num:{$gt:500}});
//查询numbers中num小于30的文档
db.numbers.find({num:{$lt:30}});
//查询numbers中num大于40小于50的文档
db.numbers.find({num:{$gt:40,$lt:50}});
//查询numbers中num大于19996文档
db.numbers.find({num:{$gt:19996}});
//查询numbers集合中的前10条数据
db.numbers.find({num:{$lte:10}});
//分页查询,skip((页码-1)*每页条数)跳过,limit表示每页显示条数
db.numbers.find().skip(10).limit(10);
//查询numbers集合中的11到20条数据
db.numbers.find().skip(20).limit(10);
//查询numbers节中的第21条到30条数据
db.numbers.find().skip(30).limit(10);
文档之间的关系:
一对一:文档可以通过内嵌文档体现出一对一的关系
use test;
db.rele.insert(
[
{name:"黄蓉",husband:{name:"郭靖"}},
{name:"潘金莲",husband:{name:"武大"}}
]
);
db.rele.find();
一对多:场景,应用和订单
db.users.insert([
{name:"sun"},
{name:"zhu"}
]);
//映射sun的订单
db.order.insert(
{
list:["西瓜","菠萝"],
user_id: ObjectId("5ecb2e1f40a59be8c08091d4")
}
);
//映射zhu的订单
db.order.insert(
{
list:["人参果","黄瓜"],
user_id: ObjectId("5ecb2e1f40a59be8c08091d5")
}
);
db.users.find();
db.order.find();
//查询用户sun的订单
var user_id = db.users.findOne({name:"sun"})._id;
db.order.find({user_id:user_id});
//查询zhu用户的订单
var user_id = db.users.findOne({name:"zhu"})._id;
db.order.find({user_id:user_id});
多对多:场景,多个来时教多个徒弟
db.teachers.insert(
[ {name:"太白"},
{name:"太乙"},
{name:"白眉"}]
);
db.teachers.find();
db.student.insert([
{name:"sun",
tech_id:[
ObjectId("5ecb32d740a59be8c08091d8"),
ObjectId("5ecb32d740a59be8c08091d9")
]
},
{name:"nezha",
tech_id:[
ObjectId("5ecb32d740a59be8c08091d8"),
ObjectId("5ecb32d740a59be8c08091d9"),
ObjectId("5ecb32d740a59be8c08091da")
]
}
]);
db.student.find();
//查看太白的徒弟
var tech_id = db.teachers.findOne({name:"太白"})._id;
db.student.find({tech_id:tech_id})[1].name;
练习:
//首先点击上方的tools——》导入文件到数据库——》选择自己的json文件
db.emp.find();
db.dept.find();
//查询集合工资小于2000的员工
db.emp.find({sal:{$lt:2000}});
//工资在1000-2000
db.emp.find({sal:{$gt:1000,$lt:2000}});
//工资小于1000大于2500的员工
db.emp.find({$or:[{sal:{$lt:1000}},{sal:{$gt:2000}}]});
//查询财务部员工从部门表中查询出部门的编号,关联员工表中的depno
var deptno = db.dept.find({dname:"财务部"})[0].deptno;
db.emp.find({depno:deptno});
//查询销售部的所有员工
var deptno = db.dept.find({dname:"销售部"})[0].deptno;
db.emp.find({depno:deptno});
//查询所有mgr为7698的所有员工
db.emp.find({mgr:7698});
//为所有工资低于1000的员工增加工资400元
db.emp.find({sal:{$lt:1400}});
db.emp.updateMany({sal:{$lt:1000}},{$inc:{sal:400}});
排序:
//查询员工表
db.emp.find({});
//sort()用来进行指定文档排序,{sal:-1}降序排列,{sal:1}升序排列
db.emp.find({}).sort({sal:1});
//先按照sal升序排序,相等的按照empno降序排序
db.emp.find({}).sort({sal:1,empno:-1});
//limit skipke可以进行任意顺序调用,
//例如:可以找出工资第二高的员工或者工资第二低的员工
db.emp.find({}).sort({sal:-1});
db.emp.find({}).sort({sal:-1}).skip(1).limit(1);
//查询时,可以再第二个位置设置查询结果 投影。
//可以自定义自己想要的列,默认_id显示,手动可关闭,例如只需要ename,sal
db.emp.find({},{ename:1,_id:0,sal:1})