以上操作形成如下目录结构
data 数据库目录
-----db 数据库文件
-----etc 数据库配置文件
-----mongo.conf
-----log 数据库日志
-----mongodb.log
7 . 启动数据库服务器
C:\Program Files\MongoDB\Server\3.4\bin
(第二种方法)
mongod --config c:/data/etc/mongo.conf 启动后无任何反应
8 .以Windows服务器运行MongoDB
以管理员方式打开CMD窗口,运行如下命令安装MongoDB服务,
然后按下 window+R 键 在运行栏目输入:services.msc 找到名为“MongoDB”的服务右键启动
mongod --config “c:\data\etc\mongo.conf” --install
启动服务方式二
在CMD窗口中运行如下命令,也可以在可以在 “控制面板\所有控制面板项\管理工具\服务”
net start mongodb
net stop mongodb 关闭服务
===============================================================================
mongodb 增删改查
启动:mongod --config c:\data\etc\mongod.conf
连接:mongo
--------增---------------
use demo 创建demo数据库
show dbs 看不到
db.createCollection(‘user’) 创建user集合
show collections 查看集合 show tables 相同
db.user.insert({name:‘张三’,age:20}) 创建users 集合 并插入一条文档
db.user.insert([{name:‘张三’,age:20},{name:‘李四’,age:30}]) 插入多条文档
db.user.save({name:‘张三’,age:30}) 等同于 insert
虽然insert和save方法都可以插入数据,当“_id”值已存在时,调用insert方法插入会报错;而save方法不会,会更新相同的_id所在行数据的信息
------------删--------------------
db.dropDatabase() ;删除当前所在数据库
db.user.drop() 删除集合
db.user.remove({name:‘张三’});删除name为张三的文档 参数 {} 删除所有
--------------查-------------------
show dbs 查询数据库
show collections 查询当前数据库下的集合 也可 show tables
db.user.find(); 查询所有 想格式化 .pretty()
db.user.findOne();查询第一条
db.user.find().count(); 查询集合文档条数
db.user.find({“_id”: ObjectId(“584bc73ea635e489676cf5db”)}) 根据id查询数据
db.user.find({age:{$gt:20}});查询年龄大于20的 $lt $eq $lte $gte $ne 不等
db.user.find({‘age’:{ g t : 20 , gt:20, gt:20,lt:30}}) 大于20 并且小于30
db.user.find({‘name’:{$ne:‘lv’}}); $ne不等于
db.user.find({$or:[{‘name’:‘lv’},{‘name’:‘chen’}]}) $or选择器 只要满足一个条件
db.user.find({$and:[{‘name’:‘lv’},{price:5000}]}) $and 多添件同事满足
db.user.find({age:{$in:[20,21,22]}}) ; $in 包含
db.user.find({age:{$nin:[20,21,22]}}) ; $nin 不包含
db.user.find().sort({age:1}) 1:表示升序 -1:表示降序
db.user.find().limit(10) 限制数量:db.表名.find().limit(数量);
db.user.find().skip(5) 跳过指定数量:db.表名.find().skip(数量);
db.user.find({},{name:1,age:1,sex:0}) 指定字段返回 1:返回 0:不返回
-------改-------------------------------------------
db.user.update({name:“张三”},{$set:{age:25}}) 更新数据: (只改第一条) 与 save()方法相同,(save有则改,没有则添加)
db.user.update({name:“张三”},{$set:{age:25}},{multi: true}) 更新数据: (匹配到的所有)
db.user.update({name:“张三”},{$set:{‘class.age’:25}})
mongoose
mongoose是NodeJS操作MongoDB数据库的中间层(中间件)NodeJS驱动不能应用在其他后端语言中
首先,安装mongoose
cnpm install mongoose --save
连接数据库
var mongoose = require(‘mongoose’);
mongoose.connect(“mongodb://localhost:27017/test”, function(err) {
if(err){
console.log(‘连接失败’);
}else{
console.log(‘连接成功’);
}
});
Mongooose中,有三个比较重要的概念,分别是Schema、Model、Entity
Schema
Schema主要用于定义MongoDB中集合Collection里文档document的结构, 如下生创建schema:
var mongoose = require(‘mongoose’);
module.exports = new mongoose.Schema({
username: String,
txt: String
});
定义Schema非常简单,指定字段名和类型即可,支持的类型包括以下8种
String 字符串
Number 数字
Date 日期
Buffer 二进制
Boolean 布尔值
Mixed 混合类型
ObjectId 对象ID
Array 数组
注意:创建Schema对象时,声明字段类型有两种方法,一种是首字母大写的字段类型,另一种是引号包含的小写字段类型
var mySchema = new Schema({title:String, author:String});
//或者
var mySchema = new Schema({title:‘string’, author:‘string’});
timestamps(时间戳)
在schema中设置timestamps为true,schema映射的文档document会自动添加createdAt和updatedAt这两个字段,代表创建时间和更新时间
var UserSchema = new Schema(
{…},
{ timestamps: true }
);
_id
每一个文档document都会被mongoose添加一个不重复的_id,_id的数据类型不是字符串,而是ObjectID类型。如果在查询语句中要使用_id,则需要使用findById语句,而不能使用find或findOne语句
Model (模型类)
模型Model是根据Schema编译出的构造器,或者称为类,通过Model可以实例化出文档对象document
文档document的创建和检索都需要通过模型Model来处理
下面我们创建一个model类:
var mongoose=require(‘mongoose’);
var myschema=require(‘…/schema/schema’);
var MyModel=mongoose.model(‘MyModel’,myschema);
module.exports=MyModel;
使用mongoose下的model()方法,将Schema编译为Model。model()方法的第一个参数是模型名称
注意:一定要将model()方法的第一个参数和其返回值设置为相同的值,否则会出现不可预知的结果
Mongoose会将集合名称设置为模型名称的小写版。如果名称的最后一个字符是字母,则会变成复数;如果名称的最后一个字符是数字,则不变;如果模型名称为"MyModel",则集合名称为"mymodels";如果模型名称为"Model1",则集合名称为"model1"
entity(实体)
通过对模型MyModel使用new方法,实例化出文档document对象
请看下例:
var MyModel=require(‘./models/model’);
var doc1 = new MyModel({username: ‘tom’ });
doc1.save(function (err,doc) {
// { __v: 0, username: ‘tom’,_id: 5970daba61162662b45a24a1 }
console.log(doc);
})
通过new Model1()创建的文档doc1,必须通过save()方法,才能将创建的文档保存到数据库的集合中
回调函数是可选项,第一个参数为err(错误对象),第二个参数为保存的文档对象
文档新增
三种方式:save()、create()、insertMany()
var MyModel=require(‘./models/model’)
//方法一
new MyModel({username:‘tom’,txt:‘hello world’}).save(function(err,doc){
//[ { _id: 59720bc0d2b1125cbcd60b3f, username: ‘tom’, txt: ‘hello world’, __v: 0 } ]
console.log(doc);
});
//方法二
MyModel.create({username:“xiaowang”},{username:“xiaoli”},function(err,doc1,doc2){
//{ __v: 0, username: ‘xiaowang’, _id: 59720d83ad8a953f5cd04664 }
console.log(doc1);
//{ __v: 0, username: ‘xiaoli’, _id: 59720d83ad8a953f5cd04665 }
console.log(doc2);
});
//方法三
temp.insertMany([{username:“a”},{username:“b”}],function(err,docs){
//[ { __v: 0, username: ‘a’, _id: 59720ea1bbf5792af824b30c },
//{ __v: 0, username: ‘b’, _id: 59720ea1bbf5792af824b30d } ]
console.log(docs); //数组
});
文档查询
三种方式:find()、findById()、findOne()
find() 四个参数都是可选的
第一个参数表示查询条件,第二个参数用于控制返回的字段,第三个参数用于配置查询参数,第四个参数是回调函数,回调函数的形式为function(err,docs){}
//查找 年龄大于18 、只返回age字段 、跳过前两条数据
temp.find({age:{$gte:18}},{age:1,name:0,_id:0},{skip:2},function(err,docs){
//find()查询 docs一定是数组
//[ { age: 27},
//{ age: 18 },
//{ age: 30}]
console.log(docs);
})
如果使用第三个参数,前两个参数如果没有值,需要设置为null
temp.find(null,null,{skip:2},function(err,docs){
//[ { _id: 5971f93be6f98ec60e3dc86e, name: ‘huo’, age: 30 },
//{ _id: 5971f93be6f98ec60e3dc86f, name: ‘li’, age: 12 } ]
console.log(docs);
})
findById()
temp.findById(“5c0881fca55c161d28da8376”,function(err,doc){
//{ _id: 5971f93be6f98ec60e3dc86c, name: ‘huochai’, age: 27 }
console.log(doc);
})
//或者下面
temp.findById(“5c0881fca55c161d28da8376”).exec(function(err,doc){
//{ _id: 5971f93be6f98ec60e3dc86c, name: ‘huochai’, age: 27 }
console.log(doc);
})
findOne()
例:
找出age>20的文档中的第一个文档,且输出包含name字段在内的最短字段 lean为true表示输出最少字段(只包含_id)
temp.findOne({age:{$gt : 20}},“name”,{lean:true},function(err,doc){
//{ _id: 5971f93be6f98ec60e3dc86c, name: ‘huochai’ }
console.log(doc);
})
temp.findOne({age:{$gt : 20}},“name”).lean().exec(function(err,doc){
//{ _id: 5971f93be6f98ec60e3dc86c, name: ‘huochai’ }
console.log(doc);
})
文档更新
update()
updateMany()
find() + save()
updateOne()
findOne() + save()
findByIdAndUpdate()
fingOneAndUpdate()
update()
第一个参数conditions为查询条件,第二个参数doc为需要修改的数据,第三个参数options为控制选项,第四个参数是回调函数
Model.update(conditions, doc, [options], [callback])
options
upsert (boolean): 默认为false。如果不存在则创建新记录。
multi (boolean): 默认为false。是否更新多个查询记录。
使用update()方法查询age大于20的数据,并将其年龄更改为40岁
//只改一条数据 如果查不到,则什么也不干
temp.update({age:{$gte:20}},{age:40},function(err,raw){
//{ n: 1, nModified: 1, ok: 1 }
console.log(raw);
})
// 所有大于20的数据 全改
temp.update({age:{$gte:20}},{age:40},{multi:true},function(err,raw){
//{ n: 1, nModified: 1, ok: 1 }
console.log(raw);
})
// 将年龄为100岁的那条信息 name改为 hundred upsert参数为true,若没有符合查询条件的文档,mongo将会综合第一第二个参数向集合插入一个新的文档
temp.update({age:100},{name: “hundred”},{upsert:true},function(err,raw){
//{ n: 1, nModified: 0,upserted: [ { index: 0, _id: 5972c202d46b621fca7fc8c7 } ], ok: 1 }
console.log(raw);
})
find() + save()
如果需要更新的操作比较复杂,可以使用find()+save()方法来处理,比如找到年龄小于30岁的数据,名字后面添加’30’字符
temp.find({age:{$lt:20}},function(err,docs){
//[ { _id: 5971f93be6f98ec60e3dc86d, name: ‘wang’, age: 10 },
//{ _id: 5971f93be6f98ec60e3dc86f, name: ‘li’, age: 12 }]
console.log(docs);
docs.forEach(function(item,index,arr){
item.name += ‘30’;
item.save();
})
//[ { _id: 5971f93be6f98ec60e3dc86d, name: ‘wang30’, age: 10 },
// { _id: 5971f93be6f98ec60e3dc86f, name: ‘li30’, age: 12 }]
console.log(docs);
});
updateOne()
updateOne()方法只能更新找到的第一条数据,即使设置{multi:true}也无法同时更新多个文档
findOne() + save()
如果需要更新的操作比较复杂,可以使用findOne()+save()方法来处理
findOneAndUpdate()
fineOneAndUpdate()方法的第四个参数回调函数的形式如下function(err,doc){}
Model.findOneAndUpdate([conditions], [update], [options], [callback])
findByIdAndUpdate
fineByIdAndUpdate()方法的第四个参数回调函数的形式如下function(err,doc){}
Model.findOneAndUpdate([conditions], [update], [options], [callback])
文档删除
有三种方法用于文档删除
remove()
findOneAndRemove()
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
结尾
学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。
阿里一直到现在。**
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-DDFeFeEo-1711687504949)]
[外链图片转存中…(img-lkBAwZUV-1711687504950)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
[外链图片转存中…(img-hEseUnUr-1711687504950)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
结尾
学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。