MongoDB的基本概念:
MongoDB优点在于和node结合的非常好,可以通过js代码实现增删改查,避免了烦人的SQL语句(nodejs也能操作mysql)
- 数据库
- 集合 collection(相当于其他数据库的表)
- 文档
理解:将整个MongoDB看作一个整体(比如对象),每个数据库就是其中的一个对象(qq),,每个集合相当于数据库对象中的一个数组(users),每个文档就是表中的一个对象,文档中可以放很多东西
一个MongoDB可以有多个数据库,一个数据库可以有多个集合,一个集合可以有多个表,一个表可以有多个文档
{ qq: { users: [ {name:"张三" , age: 18}, {name:"李四" , age: 18}, ], products: [ ] }, taobao: { }, }
MongoDB非常灵活,不需要像Mysql一样要先创建数据库,表,设计表结构,当你需要插入数据的时候,只需要指定往哪个数据库哪个集合操作就可以了,MongoDB会自动帮你完成建库建表的操作
MongoDB安装后启动操作:
1.cmd命令启动执行数据库
1.mongod (开启数据库),这里就相当于Mysql启动了服务
这句执行后会去当前执行的盘符(C)下面找data/db文件夹,这里就是MongoDB的数据存储目录,但是这个目录默认不会创建,启动不会成功,所以要手动生成 /data/db,这样才能启动服务
mkdir data
cd data
mkdir db
mongod
如果要修改默认的数据存储目录路径(但是每次启动都要这么输入,很麻烦,不推荐)
mongod --dbpath=数据存储路径
停止服务 ctrl + c 或者直接关掉cmd命令行
2.重新打开一个cmd命令行,不要关掉刚才那个
mongo (该命令默认连接本机Mongod 服务)
exit(该命令断开连接本机Mongod 服务)
基本命令:
show dbs
查看所有数据库列表(空的数据库不会显示),默认有一个admin的系统数据库
一般服务器操作步骤:创建数据库,创建表,写入数据,但MongoDB是动态的
db
查看当前操作的数据库,默认有个test空数据库
use + 数据库名称
切换到指定数据库,如果没有会新建,切换到的数据库可以通过db命令查看到
例如:use itcast
db ==> itcast (db现在是itcast这个数据库)
db.students.insertOne({"name":"Helen"})
给这个数据库中插入数据
show dbs
就能看见这个数据库了,如果数据库是空的是看不到这个数据库的
show collections ==> students
显示当前(db指向的数据库itcast)db的所有集合
db.students.find() ==> {"id":adasd231 ,"name":"Helen"}
查询students集合中的所有数据,会自动加上id值
注意:上面操作的重点是启动数据库服务,但是通过cmd命令行增删改查数据太麻烦,所以我们在nodejs中通过第三方包来操作数据库,上面的数据库服务要一直开启
2.通过nodejs操作MongoDB
官方的github说明文档https://github.com/mongodb/node-mongodb-native 可以自己学习下
官方用法比较原始,用起来比较麻烦,
使用第三方mongoose来操作MongoDB数据库,
mongoose是基于MongoDB官方的MongoDB包再做了一次封装,使用更加方便
官方文档:https://mongoosejs.com/docs/models.html
1.安装mongoose第三方包
$ npm install mongoose
2.通过mongoose第三方包提供的API来创建连接数据库,设计表的结构,增删改查数据
var mongoose = require(‘mongoose‘); //Schema就是表的结构,架构 var Schema = mongoose.Schema; //步骤一:连接数据库,连接的是本地itcast这个数据库 //如果这个数据库不存在,当你插入第一条数据后回自动创建 mongoose.connect(‘mongodb://localhost/itcast‘); //步骤二:通过Schema设计集合的结构(表结构),设计集合的目的是规定这个表有几项,每项的属性名和数据类型,保持数据完整性,防止什么数据都往一个表里写 //字段名称就是表结构中的属性名称 //字段后面的对象叫做约束,用来设定这项属性的数据类型,是否为必填项等等,(和EasyUI用法有点像) var userSchema = new Schema({ username: { type : String , required: true //说明这项必填 }, password: { type: String , required: true }, email: { type: String } }) //步骤三:将文档结构发布为模型 //mongoose.model方法用来将一个架构发布为模型 //第一个参数:传入一个大写的单数字符串用来表示你的数据库名称,mongoose会自动将其转化为小写复数的集合名称,如User => users //第二个参数:架构Schema //返回值:模型构造函数 var User = mongoose.model(‘User‘ , userSchema); // 步骤四:通过模型构造函数对users集合进行增删改查 // ====================================增加数据===================================== var admin = new User({ username: ‘admin‘, password: ‘123345‘, email: ‘xxx163.com‘ }) //保存数据 admin.save(function (err , ret) { if (err) { console.log(‘存储失败‘); } else { console.log(‘存储成功‘); console.log(ret);; } }) // ==================================查询数据======================================= //这里是查询全部数据,得到的是数组,数据就是数组中的一个对象 User.find(function(err , ret){ if (err) { console.log(‘查询失败‘); } else { console.log(ret);; } }); //查找满足条件的所有数据 //传入一个对象,根据对象中的这个属性查询对应的数据,这里查询username为‘admin‘的数据,得到的是数组 User.find({ username: ‘admin‘ } , function(err , ret){ if (err) { console.log(‘查询失败‘); } else { console.log(ret);; } }); //查找满足条件的第一条数据,这里得到的直接是一个对象了 User.findOne({ username: ‘admin‘ } , function(err , ret){ if (err) { console.log(‘查询失败‘); } else { console.log(ret);; } }) // ================================删除数据========================================= // 删除满足条件的所有数据 User.remove({ username:‘张三‘ },function(err,ret){ if (err) { console.log(‘删除失败‘); } else { console.log(‘删除成功‘); } }) //官网提供了两个删除方法:deleteOne() and deleteMany() 效果同上 // ================================更新数据========================================= User.updateOne({username: ‘张三‘} , { password: ‘666‘} , function(err ,ret){ if (err) { console.log(‘更新失败‘); } else { console.log(‘更新成功‘); console.log(ret); } }) //应该还有update方法用来更新有数据,可以试一下 // 通过id查找并更新,这个ID是生成数据的时候产生的,可以通过find查询数据得到 User.findByIdAndUpdate(‘5jkdsah67ksjdn‘ , { password: ‘666‘} , function(err ,ret){ if (err) { console.log(‘更新失败‘); } else { console.log(‘更新成功‘); console.log(ret); } })