博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MongoDB教程
阅读量:6202 次
发布时间:2019-06-21

本文共 8609 字,大约阅读时间需要 28 分钟。

一、安装

然后配置环境变量,找到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,连接数据库,然后就可以进行数据库的一些操作。

  • show dbs:查看已经存在的数据库
    MongoDB教程
  • db.version() :查看数据库版本
  • show users:显示用户
  • use admin :进入admin数据库,现在就可以使用这个库了(如果没有这个库,就会自动新建这个库),如果该新建的库下面没有数据,默认不显示该库
  • show collections:查看该数据库下所有的集合
  • db:查看目前在哪个数据库下,或者说目前正在使用哪个数据库

二、MongoDB与关系型数据库的区别

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定义,不要使用letvar 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如果不指定也会返回,如果不想让他返回需要显式指定为0PersonModel.find({},{name:1, age:1, _id:0},function(err,docs){   //find返回的是所有的数据,格式是一个数组,数组里面的每一项是一个json    console.log(docs);})//当找到第一条匹配的记录时就立刻返回,不再继续查找了,返回单个对象 //findOne返回的是匹配到的第一条数据,格式是一个jsonPersonModel.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:

MongoDB教程

转载于:https://blog.51cto.com/9161018/2346578

你可能感兴趣的文章
MVC文章汇总
查看>>
郁闷的一次调优
查看>>
POJ 3096 Surprising Strings
查看>>
[置顶] css3 befor after 简单使用 制作时尚焦点图相框
查看>>
ListView 滚动条的图标样式
查看>>
手动升级11.2.0.1的rac数据库到11.2.0.4
查看>>
443 Chapter9.Database Mirroring
查看>>
SqlQuery池
查看>>
zookeeper学习记录
查看>>
QQ客服左右提示
查看>>
CSS让同一行文字和输入框对齐
查看>>
Starling:支持memcached协议队列服务器
查看>>
一句代码实现 HTML5 语音搜索
查看>>
C#.NET 关于URL重写技术汇总(三)之域名进行重写,即实现二级或多级域名
查看>>
项目文件必须在引用列表中包含.net framework 程序集“WindowsBase,PresentationCore,PresentationFramework”。错误处理!...
查看>>
Ext.net开发中一些不易发现的功能(1)--Gridpanel上插入超链接
查看>>
[转]typedef的四个用途和两个陷阱
查看>>
建造者模式(Builder)
查看>>
JavaScript数值类型及变量
查看>>
【转】CSS雪碧图会占用太多浏览器内存吗
查看>>