MongoDB 和 Mongoose 04
一、安装
1. 相关
- MongoDB的版本偶数版本为稳定版,奇数版本为开发版
- MongoDB对于32位系统支持不佳,所以3.2版本以后没有再对32位系统的支持
2.配置步骤:
下载,安装,将安装后的bin目录配置到环境变量里
C盘根目录创建 data/db
cmd :
mongod
可启动MongoDB服务器,(32位系统第一次启动,输入 mongod --storageEngine=mmapv1
)指定端口和路径:
mongod --dbpath 路径 --port 端口号
更改端口号,mongod --dbpath C:\Users\dxuan\Desktop\data\db --port 123
3.将MongoDB配置为系统服务:
可以自动在后台启动,不需要每次都启动
(1) mkdir c:\data\log
,也就是在刚刚c盘根目录下,data下创建一个 log 目录
(2)在D:\Program Files\MongoDB\Server\3.2 下建配置文件:mongod.cfg ,然后执行
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"
注意路径
(3)然后 services.msc,在 windows 的服务里,开启服务即可。
4. 可视化工具
NoSQL Manage for MongoDB ,用这个可视化工具,MongoDB默认端口号为 27017
二、使用
1.mongoDB的基本指令
show dbs:显示当前所有的数据库
use 数据库名 :进入到指定数据库中
db:显示当前所在的数据库
show collections:显示数据库中的所有集合
2. 基本使用
//1.创建并进入it_like数据库
use it_like; // 有这个数据则进去,没有则创建
db
//2.向数据库的colleges集合中插入六个文档(Html5, Java, Python, 区块链, K12, <PHP, "世界上最好的编程语言">)
db.colleges.insert([
{name:'Html5'},
{name:'Java'},
{name:'Python'},
{name:'区块链'},
{name:'K12'},
{name:'PHP',intro:'世界上最好的编程语言'}
]);
//如果有colleges 这个集合,则进入,没有,则创建
//3.查询colleges集合中的文档
db.colleges.find({}); //查找所有
db.colleges.find({name:'PHP'});
//4.向数据库的colleges集合中插入一个文档(Golang)
db.colleges.insert({name:'Golang'}) ;
//5.统计数据库colleges集合中的文档数量
db.colleges.find({}).count()
//6.查询数据库colleges集合中name为Html5的文档
db.colleges.find({name:'Html5'})
//7.向数据库colleges集合中的name为Html5的文档,添加一个intro属性
db.colleges.update({name:'Html5'},{$set:{intro:'Hi,我是詹姆士邦德'}}) //给html5 增加intro
db.colleges.find()
//8.使用{name:"大数据"} 替换 name 为 "K12"的文档
db.colleges.replaceOne({name:'K12'},{name:'大数据'});
//9.删除name为PHP的文档的intro属性
db.colleges.update({name:'PHP'},{$unset:{intro:1}}) //1表示任意的东西
//10.向name为Html5的文档中,添加一个classes:{base:["h5+c3","js","jQuery", "abc"] , core:["三大框架","node.js"]}
db.colleges.update({name:'Html5'},{$set:{classes:{base:["h5+c3","js","jQuery", "abc"] , core:["三大框架","node.js"]}}});
//11.查询有核心课程为 三大框架 的文档
db.colleges.find({'classes.core':'三大框架'})
//12.向name为Html5的文档中,添加一个新的核心课程 "微信小程序"
// $push: 向数组中添加一个新元素
// $addToSet: 向数组中添加一个新元素,区别在于,如果数组中存在这个元素,则不会重复添加
db.colleges.update({name:'Html5'},{$push:{'classes.core':'微信小程序'}});
db.colleges.update({name:'Html5'},{$addToSet:{'classes.core':'幽灵党'}})
db.colleges.find();
//13.,删除课程为"abc"的文档
db.colleges.remove({'classes.base':'abc'});
//14.删除colleges集合
db.colleges.remove({});
db.colleges.drop(); //删除数据库
use gjd_database;
show dbs
//15.向集合中中插入10000个文档
// 方式1 4.3s
for(var i=0;i<10000;i++){
db.demos.insert({no:i});
}
// 方式2 0.3s
db.demos.remove({});
var arr = [];
for(var i=1;i<10000;i++){
arr.push({counter:i});
}
db.demos.insert(arr);
//16.查询demos中counter为666的文档
db.demos.find({counter:666});
//17.查询demos中counter小于168的文档
db.demos.find({counter:{$lt:168}});
//18.查询demos中counter大于666的文档
db.demos.find({counter:{$gt:666}})
//19.查询demos中counter大于66小于666的文档
db.demos.find({counter:{$lt:666,$gt:66}})
//20.查看demos集合中的前10条数据
db.demos.find({counter:{$lte:10}});
db.demos.find({}).limit(10);
//21.查看demos集合中的第11条到20条数据
/*
1-10 1
11-20 2
21-30 3
...
公式:skip((页码-1) * 每页显示的条数).limit(每页显示的条数)
*/
db.demos.find({}).skip((2-1)*10).limit(10);
//22.查看demos集合中的第21条到30条数据
db.demos.find({}).skip(20).limit(10);
3.多表联查
//23. 创建company数据库, 将con和tea集合导入到数据库中
db.con.insert([
{cno: "1001", cname: "HTML5学院"},
{cno: "1002", cname: "Python学院"},
{cno: "1003", cname: "Java学院"},
{cno: "1004", cname: "Go学院"}
]);
db.tea.insert([
{name: "胡雪", job: "辅导员", wages: 10000.0, cno: "1001", bonus: 1688},
{name: "赵乐乐", job: "讲师", wages: 20000.0, cno: "1001", bonus: 2600},
{name: "冯璐璐", job: "辅导员", wages: 12000.0, cno: "1001"},
{name: "赵晓雪", job: "辅导员", wages: 12000.0, cno: "1002", bonus: 1688},
{name: "孙芙蓉", job: "讲师", wages: 13000.0, cno: "1002", bonus: 1288},
{name: "胡霍恋", job: "辅导员", wages: 11000.0, cno: "1003", bonus: 2688},
{name: "张思琪", job: "班主任", wages: 9000.0, cno: "1003"},
{name: "王红叶", job: "辅导员", wages: 8000.0, cno: "1002", bonus: 1675},
{name: "叶子奇", job: "高级讲师", wages: 30000.0, cno: "1001", bonus: 2345},
{name: "高伟伟", job: "辅导员", wages: 17000.0, cno: "1002", bonus: 1345}
]);
//24.查询HTML5学院的所有老师
var cno = db.con.findOne({cname:'HTML5学院'}).cno;
db.tea.find({cno:cno});
//25.查询工资大于20000的员工
db.tea.find({wages:{$gt:20000}})
//26.查询工资在10000-20000之间的员工
db.tea.find({wages:{$gt:10000,$lt:20000}})
//27.查询工资小于10000或大于25000的员工
db.tea.find({$or:[{wages:{$lt:10000}},{wages:{$gt:25000}}]})
//28.为所有薪资低于10000的员工增加工资1000元
db.tea.updateMany({wages:{$lt:10000}},{$inc:{wages:1000}})
三、Mongoose
1、Mongoose 说明
个让我们可以通过Node来操作MongoDB的模块。
Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能。
mongoose的优势:
可以为文档创建一个模式结构(Schema)
可以对模型中的对象/文档进行验证
数据可以通过类型转换转换为对象模型
可以使用中间件来应用业务逻辑挂钩
比Node原生的MongoDB驱动更容易
2.mongoose使用
相关概念:
mongoose中提供了几个新的对象
Schema(模式对象):Schema对象定义约束了数据库中的文档结构
Model:Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection
Document:Document表示集合中的具体文档
1.下载安装Mongoose
npm i mongoose --save
2.在项目中引入mongoose
let mongoose = require("mongoose");
3.连接MongoDB数据库
mongoose.connect('mongodb://数据库的ip地址:端口号/数据库名');
如果端口号是默认端口号(27017) 则可以省略不写
001.js 监听MongoDB连接状态:
// 1 引入模块
let mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/m_data');
// 2 监听各种状态
let db = mongoose.connection;
// 2.1 连接失败
db.on('error',()=>{
console.log('连接数据库失败');
});
// 2.2 连接成功
db.once('open',()=>{
console.log('连接成功');
});
// 2.3 断开连接成功
db.once('close',()=>{
console.log('断开成功');
});
//连接成功
//断开成功
增删改查:
// 1 引入模块
let mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/m_data');
mongoose.connection.once('open',()=>{
console.log('数据库里连接成功');
});
// 2 Schema 模式对象
let Schema = mongoose.Schema;
let personalSchema = new Schema({
name: String,
age: Number,
chat: String,
sex: {
type: String,
default: '男'
}
});
// 3 创建 Model 集合对象
let personalModel = mongoose.model('person',personalSchema);
// 4 CRUD
// 4.1 -------- 增 --------
/*
personalModel.create([
{name: '鸣人',age: 18,chat: 'nurato'},
{name: '卡卡西',age: 50,chat: 'kakaxi', sex: '女'},
{name: '雏田',age: 38,chat: 'ct'},
{name: '纲手',age: 18,chat: '', sex: '女'}
],(err)=>{
if(!err){
console.log('插入成功');
}else {
throw err;
}
});
*/
// 4.2 ------- 查 ---------
/*
personalModel.find({},(err,docs)=>{
if(!err){
console.log(docs[0]); // 第一条数据
console.log(typeof docs); //onject
}
});
*/
/*
personalModel.find({name:'鸣人'},(err,docs)=>{
if (!err){
console.log(docs);
}
});
*/
/*
// 设置 1 则查询出来,设置0 则不查询出来
personalModel.find({},{name:1,_id:0,sex:1},(err,docs)=>{
if(!err){
console.log(docs);
}else{
throw err;
}
});
*/
/*
// 负号,也可以设置不查询,skip 和 limit 就是skip 几个然后开始查询,查询多少条。
personalModel.find({},"-_id name age",{skip:1,limit:2},(err,docs)=>{
if (!err){
console.log(docs);
}else {
throw err;
}
});
*/
// 4.3 ------- 修改 ----------
/*
// 这个是,如果根据 name 查询出两条数据,则只更新第一条
personalModel.update({name:'鸣人'},{$set:{age:27}},(err)=>{
if(!err){
console.log('update success');
}else {
throw err;
}
});
*/
/*
// 增加 multi:true ,匹配到的数据全部更新
personalModel.update({name:'鸣人'},{$set:{age:99}},{multi:true},(err)=>{
if(!err){
console.log('update success');
}else {
throw err;
}
});
*/
// 4.4 ------- 删除 ------
// remove 是全部删除,官方文档说增加 {single : true} 可以删除多个,但是有时候会报错
// 可以使用 deleteOne() deleteMany() ,一个是删除匹配到的第一个,后者是匹配到的全部删除
/*personalModel.remove({name: '鸣人'},(err,docs)=>{
if(!err){
console.log(docs);
console.log('delete success');
}else {
throw err;
}
});*/
/*
personalModel.deleteMany({name: '雏田'},(err,docs)=>{
if(!err){
console.log(docs); //{ ok: 1, n: 2 } 2 应该是表示删除了几行
console.log('delete success');
}else {
throw err;
}
});
*/
// 4.5 统计个数
personalModel.count({}, (err, count)=>{
if(!err){
console.log(count);
}else {
throw err;
}
});
MongoDB 和 Mongoose 04的更多相关文章
- Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongoose,或者node.js的native驱动。
Persistence with MongoDB and Mongoose https://github.com/azat-co/practicalnode/blob/master/chapter5/ ...
- 【重学Node.js 第3篇】mongodb以及mongoose的使用
mongodb以及mongoose的使用 本篇为这个系列的第三篇,想看更多可以直接去github的项目:https://github.com/hellozhangran/happy-egg-serve ...
- 前端知识点回顾——mongodb和mongoose模块
mongodb和mongoose模块 数据库 数据库有关系型数据库(MySQL)和非关系型数据库(mongodb),两者的语法和数据存储形式不一样. mySQL 关系型数据库 类似于表格的形式,每一条 ...
- mongodb用mongoose取到的对象不能增加属性
先定义了一个article的schema var mongoose = require('mongoose'); var Schema = mongoose.Schema; exports.schem ...
- 前端笔记之NodeJS(四)MongoDB数据库&Mongoose&自制接口&MVC架构思想|实战
一.MongoDB数据库 1.1 NoSQL简介 随着互联网web2.0网站的兴起,传统的SQL数据库(关系数据库)在应付web2.0网站,特别是超大规模和高并发的SNS(social network ...
- MongoDB及Mongoose的记录
MongoDB是一种NoSQL的文档型数据库,其存储的文档类型都是JSON对象. 在node.js中由于代码都是异步执行,且nosql也没有“事物”这一定义,所以日常使用中很难保证数据库操作的原子性. ...
- mongoDB与mongoose
mongodb是一个基于分布式文件存储的文档型数据库 MongoDB 是一个介于关系数据库和非关系数据库之间的产品 MongoDB 最大的特点是他支持的查询语言非常强大,而且还支持对数据建立索引 官方 ...
- [转] mongoDB与mongoose
mongoDB简介 mongoDB与一些关系型数据库相比,它更显得轻巧.灵活,非常适合在数据规模很大.事务性不强的场合下使用.同时它也是一个对象数据库,没有表.行等概念,也没有固定的模式和结构,所有的 ...
- mongodb用mongoose查库的对象,不能增加属性
node + koa2 + mongodb 写了一个给前端的接口 如果不是写这个接口,这辈子都发现不了mongodb里这个大坑 mongoose 是个ODM(Object Document Mappe ...
随机推荐
- JSON转C#实体类
https://www.bejson.com/convert/json2csharp/
- repoquery详解——linux查看包依赖关系的神器
repoquery是yum扩展工具包yum-utils中的一个工具,所有如果你没有repoquery命令的话,可以先 sudo yum install yum-utils 安装yum-utils包.是 ...
- rockmongo配置文件config.php
使用编辑器(比如notepad或者VI/VIM命令)打开RockMongo安装目录下的config.php,所有的配置都在这里. 认证 mongo_auth 和control_auth 在开始使用Ro ...
- JavaScript 闭包初认识
1.简单的例子 首先从一个经典错误谈起,页面上有若干个div, 我们想给它们绑定一个onclick方法,于是有了下面的代码 <ul id="divTest"> < ...
- 全局数据 GetGlobalDataSet
/// <summary> /// 获取全局数据 /// </summary> /// <returns></returns> public DataS ...
- Web程序中使用EasyUI时乱码问题
今天偶然遇见使用easyUI时,弹窗和分页都是乱码的问题,耗费了很长的时间来解决,以此记住这个坑. 相信大家都会在使用easyUI时都会设置这样一句: 那么就有可能出现设置中文后的乱码问题,如下图: ...
- Django分页解析
分页 django中实现管理数据分页的类位于 django.core.paginator.py中 Paginator类 对列表数据进行分页处理 对象 Paginator(Post.objects.al ...
- BZOJ2535: [Noi2010]Plane 航空管制2(拓扑排序 贪心)
题意 题目链接 Sol 非常妙的一道题. 首先不难想到拓扑排序,但是直接对原图按\(k\)从小到大拓扑排序是错的.因为当前的\(k\)大并不意味着后面的点\(k\)也大 但是在反图上按\(k\)从大到 ...
- 10th week task -1
1:For each ... inFor...in ExamplesFor...of 对以上的内容进行 Examples和Explanation (1)For...in 以任意顺序遍历一个对象的可枚举 ...
- css sticky footer布局
Sticky footers设计是最古老和最常见的效果之一,大多数人都曾经经历过.它可以概括如下:如果页面内容不够长的时候,页脚块粘贴在视窗底部:如果内容足够长时,页脚块会被内容向下推送.套路为:内容 ...