MongoDB学习


第一步:下载,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

  1. 查看数据库中所有的集合 : 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…自动下载罪行的工具,安装好之后就可以进行使用了

管理工具更改字体:

image-20200525075639998

新增数据:

/*
*新增数据:新增一条数据和新增多条数据,多条数据添加时是一个数组的形式
*/
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集合中的1120条数据
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})

文章作者: it星
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 it星 !
 上一篇
GUI编程 GUI编程
it星
GUI编程(纯属个人喜好) 窗口、弹窗、面板、文本框、列表框、按钮、图片、监听事件、鼠标、键盘事件、破解工具 1.简介GUI核心技术:Swing 、AWT、界面不美观 GUI编程的学习主要是一些思想:MVC架构,了解监听 2.AWT2.1简
2020-05-27
下一篇 
java基础知识 java基础知识
由于自己忘性比较大,最初学习的时候也没有做笔记,因此后期学习吃力,对于前期学习的知识进行笔记重新整理与学习,巩固加强,温故而知新、可以为师矣。 1.java异常异常:在java语言中,将程序执行中发生的不正常情况称为异常,java语言中的异
2020-05-23
  目录