您好,登录后才能下订单哦!
一、安装
然后配置环境变量,找到bin目录,复制路径,path下面新建,然后copy目录进去,确定即可
配置“环境变量”,目的是在命令行中直接使用,而不需要输入很长的路径进入安装目录下再进行使用了。
1、打开终端,输入mongod,启动MongoDB服务器
2、出现错误,原因:C:\目录下,没有 data\db 文件夹,解决方法:在c盘下,新建data文件夹,在data下面再新建db文件夹;因为MongoDB在Windows中默认的数据库目录是c:\data。如果在没有该目录的情况下,直接运行mongod,就会报错误
3、但是我们可以更改数据库目录
mongod --dbpath=D:\妙味课堂文件夹\190122Nodejs开发博客系统\db --port=27017
--dbpath是指定数据库存放目录
--port是指数据库端口号
4、重新输入mongod,启动MongoDB服务器,默认端口27017
5、成功启动MongoDB服务器后,再打开一个命令行窗口输入mongo,连接数据库,然后就可以进行数据库的一些操作。
二、MongoDB与关系型数据库的区别
比如:mysql的表tables,MongoDB这里叫集合collections,集合里面的每一条数据叫做文件(document)
mongoDB是非关系型数据库,将数据存储为一个文档,数据结构由键值对组成。mongoDB文档类似于JSON对象,字段值可以包含其他文档、数组及文档数组。
一个mongoDB可以建立多个数据库
三、创建数据库,插入数据,查看数据
use user //新建数据库
db.user.insert({ "name":"xiao" }) //增加一条数据
db.user.find() // 查看所有的数据
db.user.findOne() // 显示第一条数据
db.user.update({ "name":"xiao" },{"name":"kate","age":"18"}) //修改数据
db.user.remove({ "name":"xiao" }) //删除数据
四、用js文件写mongo命令
//将用户名和登录时间插入log库,通过goTask.js操作,变量均使用var定义,不要使用let
var userName="jspang"; //声明一个登录名
var timeStamp=Date.parse(new Date()); //声明登录时的时间戳
var jsonDdatabase={"loginUnser":userName,"loginTime":timeStamp}; //组成JSON字符串
var db = connect('log'); //链接数据库,在命令行是使用use log,在js文件里是使用connect('log'),没有即创建库
db.login.insert(jsonDdatabase); //插入数据
print('[demo]log print success'); //没有错误显示成功
//执行文件,命令行:mongo goTask.js
五、批量插入
在操作数据库时要注意两个能力:
第一个是快速存储能力。
第二个是方便迅速查询能力。
注意一次插入不要超过48M,插入.zip和大图片什么的尽量用静态存储,MongoDB存储静态路径就好,这也算是一个规则。
在工作中如果在循环插入和批量插入举起不定,那就选批量插入吧,它会给我们更优的性能体验。
九、在express里面使用mongoDB
1、理解mongoose的属性、模型
2、mongoose是mongoDB的一个对象模型工具,是基于node-mongodb-native开发的mongoDB的nodejs驱动,可以在异步的环境下执行。同时它也是针对mongoDB操作的一个对象模型库,封装了mongoDB对文档的一些增删改查等常用方法,让nodejs操作mongoDB数据库变得更加容易。
如果要通过mongoose创建一个集合并对其进行增删改查,就需要用到Schema(数据属性模型)、Model、Entity
3、Schema (属性)
在Mongoose里一切都是从Schema开始的,每一个Schema都会映射到MongoDB的一个collection上。Schema定义了collection里documents的模板(或者说是框架)。一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力,仅仅只是数据库模型在程序片段中的一种表现,可以说是数据属性模型(传统意义的表结构),又或者是集合的模型骨架。基本属性类型有字符串、日期型、数值型、布尔型、null、数组、内嵌文档等。
var blogSchema = new Schema({ // Schema头字母大写,因为Schema是构造函数
title: String,
comments: [{ body: String, date: Date }], // 对象数组
date: { type: Date, default: Date.now }, // 通过default设置默认值
hidden: Boolean,
meta: { // 嵌套对象
votes: Number,
favs: Number
}
});
4、model (模型)
为了使用定义好的Schema,我们需要把blogSchema转换成我们可以使用的model(其实是把Schema编译成model,所以对于Schema的一切定义都要在compile之前完成)。也就是说model才是我们可以进行操作的handle。
由Schema构造生成的模型,除了Schema定义的数据库骨架以外,还具有数据库操作的行为,类似于管理数据属性、行为的类。
var Blog = mongoose.model('Blog', blogSchema);//编译model
这样我们就获得了一个名为Blog的model了。生成model的同时MongoDB中对应的collection也被建立了,model的名字是Blog,而collection的名字被默认是model名字的复数也就是blogs(细心的小伙伴会发现不止变复数了,而且字母全部变小写了,亲测是这样的)。【由Schema发布生成的模型,具有抽象属性和行为的数据库操作对】
//创建模型,可以用它来操作数据库中的person集合,指的是整体。创建一个person集合
var PersonModel = db.model("person", PersonSchema);
person:数据库中的集合名称,当我们对其添加数据时如果person已经存在,则会保存到其目录下,如果未存在,则会创建person集合,然后再保存数据。有了model,也就有了操作数据的能力。创建一个Model模型,需要指定两点:1,集合名称;2,集合的Schema结构对象。满足这两点,就可以操作数据库啦。
5、Schema和model的理解
不同于关系型数据库,MongoDB作为文档型数据库,Scheme、model、collection、document是其中的四大元素。document是MongoDB里的基本存储单位,collection是众多同类document的集合。Schema定义了一类document的模板,让这一类document在数据库中有一个具体的构成、存储模式。而Schema仅仅是定义了Document是什么样子的,至于生成document和对document进行各种操作(增删改查)则是通过相对应的model来进行的。
需要说明的是MongoDB中实际上只有collection和document,Schema和model不过是定义和生成前二者过程中的工具而已。
6、入门案例
//2 加载模块
var mongoose = require("mongoose");
//3. 连接数据库 mongod 服务器端 mongo客户端
//数据库的名称可以是不存在 创建一个zf数据库
var db = mongoose.connect("mongodb://123.57.143.189:27017/zf");
//如果连接成功会执行error回调
db.connection.on("error", function (error) {
console.log("数据库连接失败:" + error);
});
//如果连接成功会执行open回调
db.connection.on("open", function () {
console.log("数据库连接成功");
});
//定义一个 schema,描述此集合里有哪些字段,字段是什么类型
//只有schema中有的属性才能被保存到数据库中
var PersonSchema = new mongoose.Schema({
name : { type:String },
home : { type:String },
age : { type:Number, default:0 },
time : { type:Date, default:Date.now },
email: { type:String,default:''}
});
//创建模型,可以用它来操作数据库中的person集合,指的是整体
var PersonModel = db.model("person", PersonSchema);
//根据模型创建实体,是指的个体对象
var personEntity = new PersonModel({
name : "zf",
age : 6,
email: "zf@qq.com",
home:'beijing'
});
//用save 方法把自己保存到数据库中
personEntity.save(function(error,doc){
if(error){
console.log("error :" + error);
}else{
console.log(doc);
}
});
7、mongoose基础操作
①查询:
db.Userl.find({conditions}, {options}, callback)
conditions Object类型 //查询条件
options Object 类型 //查询配置参数
callback Function //回调
db.teacher.find().pretty() //加上pretty,返回结果更加易读(在命令行展示效果)
查询分为多种类型,如条件查询、过滤查询等。options省略或为null,则返回所有属性;options中把需要显示的属性设置为大于零的数则返回该属性,_id不指定默认返回,设置_id为0则不返回该属性,其他字段不指定,默认不返回
PersonModel.find({},function(error,docs){
//conditions为空就显示模型下所有数据
})
// 查询Article模型下所有数据
db.Article.find({}, function(err, docs){
if (err) {
console.log('出错'+ err);
return;
}
res.json(docs); // 以json格式输出
});
MPersonModel不需要new了,通过var PersonModel = db.model("person", PersonSchema);获取之后可以马上使用了。Schema对象需要new一下。
查询就是返回一个集合中文档的子集,mongoose模型提供了find、findOne和findById方法用于文档查询
findOne查询单条,当查询到一个符合条件的数据时,就会停止继续查询并返回查询结果。
//创建模型,可以用它来操作数据库中的person集合,指的是整体
var PersonModel = db.model("person", PersonSchema);
//指定返回的字段 1表示 返回 0 不返回 ,,
//如果不指定的字段默认不返回
//_id如果不指定也会返回,如果不想让他返回需要显式指定为0
PersonModel.find({},{name:1, age:1, _id:0},function(err,docs){ //find返回的是所有的数据,格式是一个数组,数组里面的每一项是一个json
console.log(docs);
})
//当找到第一条匹配的记录时就立刻返回,不再继续查找了,返回单个对象
//findOne返回的是匹配到的第一条数据,格式是一个json
PersonModel.findOne({name:/^\w+9$/},{name:1, age:1, _id:0},function(err,doc){
console.log(doc);
})
//按照ID进行查询
PersonModel.findById('56ee117356acb568054dd6d4',{name:1, age:1, _id:0},function(err,doc){
console.log(doc);
})
②保存||增加
save是一个实例方法,使用时需要先 new Model() 来实例化
//根据模型创建实体,是指的个体对象
var personEntity = new PersonModel({
name : "zf",
age : 6,
email: "zf@qq.com",
home:'beijing'
});
//用save 方法把自己保存到数据库中
personEntity.save(function(error,doc){
if(error){
console.log("error :" + error);
}else{
console.log(doc);
}
});
//保存一个用户信息,userobj为你创建的文档对象模型里的字段,需正确对应传入
const userobj={
email: query,
passworld: req.body.passworld,
hash: hash,
isregister: false,
score: 5,
sign: [],
signdate: ''
}
new db.MUser(userobj).save(function(error){
if (error) {
res.status(500).send()
return
}
res.json({statu: 200})
})
③数据更新
Model.update(查询条件,更新对象,callback) 默认更新一条文档,若想全部更新,需要加上{multi:true}
//创建模型,可以用它来操作数据库中的person集合,指的是整体
var PersonModel = db.model("person", PersonSchema);
//$set更新器 指定要更新的字段
var update = {$set : { age : 100 }};
//更新
//multi 更新匹配到的所有的记录
PersonModel.update({name : 'zf'}, update,{multi:true}, function(error){
if(error) {
console.log(error);
} else {
console.log('Update success!');
}
});
// 更新指定email字段数据条目下字段为content的内容,如果不存在就创建该字段
db.Share.update({email: email},{$set:{content: newarr}}, function(err, docs){
if (err) {
res.status(500).send();
return
}
res.json({statu: 200});
})
//$set 指定字段的值,这个字段不存在就创建它。可以是任何MondoDB支持的类型。
Article.update({_id : id}, {$set : {views : 51, title : ‘修改后的标题’ …}})
//$unset 同上取反,删除一个字段
Article.update({views : 50}, {$unset : {views : ‘remove’}})
//执行后: views字段不存在
//$inc 增减修改器,只对数字有效。
Article.update({_id : id}, {$inc : {views : 1}})
//$push 为字段为数组的内容push数据
Article.update({_id : id}, {$push : {message : messageobj}})
//$pop从头部或尾部删除单个元素(1为从后面删除,-1为从前面删除)
db.Article.update(({_id: id), {$pop:{relationships: -1})
//__$pull__删除满足条件的元素,不止删除一个
db.Article.update(({_id: id), {$pull:{“relationships”:{“fname”:”dongren”, ”lname”: ”zeng”}}})
④数据删除
Model.remove(查询条件,callback)
PersonModel.remove({name:'zf'},function(err,docs){
//result: { ok: 1, n: 3 }
console.log(docs);
});
db.Course.remove({_id: req.body.id}, function(err, docs){
if (err) {
res.status(500).send();
return
}
res.json({statu: 200})
})
⑤Limit()
limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
只显示两条记录:db.student.find().limit(2).pretty() //显示student集合中前两条记录
limit()中number值为空时代表全部查出
⑥skip()
skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
跳过前三条记录:db.student.find().pretty().skip(3)
只显示第4条记录:db.student.find().pretty().limit(1).skip(3) 或者 db.student.find().pretty().skip(3).limit(1)
⑦排序sort()
sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
db.COLLECTION_NAME.find().sort({KEY:1})
将Student集合中的文档按照年龄升序排列:db.student.find().sort({age:1})
【注意】skip()与limit()的前后顺序没有要求,不管怎么放置他们执行的顺序都是先sort()后skip()最后limit()
⑧count
计算数据库总数据数目
⑨⑩⑪⑫
十、使用可视化图形软件robomongo:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。