mongoDB初识一二三
官网下载
选择server => MongoDB Community Server(商业版) => 选择64位的下载
安装一路回车,我这里安装到了C:\Program Files\MongoDB\Server\4.0\bin
配置环境变量
运行MongoDB服务端
启动服务端,启动服务的命令的文件是:mongod.exe
- 1.打开命令行(win+R),输入mongod
- 2.会发现服务并没有启动,报exception(异常)
- 3.可以在c盘新建data\db文件夹,或者需要新建db文件夹作为数据库存放路径,在
C:\Program Files\MongoDB
下新建一个db文件夹,win+R,输入cmd,然后用cd命令进入C:\Program Files\MongoDB
:\bin目录下,执行如下命令:C:\Program Files\MongoDB\bin>mongod.exe --dbpath C:\Program Files\MongoDB\db
将会输出服务端相关信息,包括版本,数据库所在路径,监听端口号,数据库大小等等、看到这个说明你已经成功了,默认端口是27017
- 4.服务端开启后,可以用命令行链接服务端,链接文件是mongo.ext,不要关闭服务端Dos,重新打开一个dos窗口,输入mongo,链接后,输入以下指令:
查看存在数据库命令:mongo show dbs
查看数据库版本命令:mongo db.version()
复制代码
如果有数据说明安装成功
mongoDB常用指令
mongo shell 如果以前接触过数据库一定知道每个数据库都有自己独特的命令,MSSQL和MYsql用的都是Sql命令,MongoDB的操作命令就是前端最熟悉的JavaScript命令
操作前你需要打开Mongo服务器和链接到服务器-也就是我们的mongod命令和mongo命令
var x='Hello World'
print(x)
复制代码
这里的输出命令不是console.log,而是print
输入函数,输入一半时会有3个点表示没输完的语句可以继续输
MongoDB的存储结构
以前我们的关系型数据库的数据结构都是顶层是库,库下面是表,表下面是数据。但是MongoDB有所不同,库下面是集合,集合下面是文件,可以看下面这张图进行了解一下。
mongoddb(非关系型数据库) | mysql(关系型数据库) |
---|---|
文件(document) | 行(row) |
集合(collections) | 表(table) |
数据库(databases) | 数据库(databases) |
- show dbs :显示已有数据库,如果你刚安装好,会默认有local、admin(config),这是MongoDB的默认数据库,我们在新建库时是不允许起这些名称的。
- use admin: 进入数据,也可以理解成为使用数据库。成功会显示:switched to db admin。
- show collections: 显示数据库中的集合(关系型中叫表,我们要逐渐熟悉)。 db:显示当前位置,也就是你当前使用的数据库名称,这个命令算是最常用的,因为你在作任何操作的时候都要先查看一下自己所在的库,以免造成操作错误。
- use db(建立数据库):use不仅可以进入一个数据库,如果你敲入的库不存在,它还可以帮你建立一个库。但是在没有集合前,它还是默认为空。
- db.collection.insertOne() 将单个文档插入到集合中
- db.collection.insertMany() 将多个 文档插入集合中
- db.集合.insert( ):新建数据集合和插入文件(数据),当集合没有时,这时候就可以新建一个集合,并向里边插入数据。Demo:db.user.insert({“name”:”xiaoling”})
- db.集合.find( ):查询所有数据,这条命令会列出集合下的所有数据,可以看到MongoDB是自动给我们加入了索引值的。Demo:db.user.find()
- db.集合.findOne( ):查询第一个文件数据,这里需要注意的,所有MongoDB的组合单词都使用首字母小写的驼峰式写法。
- db.集合.update({查询},{修改}):修改文件数据,第一个是查询条件,第二个是要修改成的值。这里注意的是可以多加文件数据项的,比如下面的例子。
- db.集合.remove(条件):删除文件数据,注意的是要跟一个条件。Demo:db.user.remove({“name”:”xiaoling”})
- db.集合.deleteMany() 删除所有文档
- db.集合.drop( ):删除整个集合,这个在实际工作中一定要谨慎使用,如果是程序,一定要二次确认。
- db.dropDatabase( ):删除整个数据库,在删除库时,一定要先进入数据库,然后再删除。实际工作中这个基本不用,实际工作可定需要保留数据和痕迹的。
- exit 退出命令
在js中写mongodb
eg 新建一个login.js文件
var userName = 'niuxiaoling'; // 声明登录名
var timeStamp = Date.parse(new Date()); //时间戳
var jsonDatebase = {'loginName':userName,"loginTime":timeStamp
}
var db = connect('log');//use log
db.login.insert(jsonDatebase); // login集合print('log print success');
复制代码
执行login.js 直接DOS中 mongo login.js
在操作数据库时要注意: 第一个是快速存储能力 第二个是迅速查询能力
批量插入数据
db.test.insert([{"_id":1},{"_id":2},{"_id":3}
])
复制代码
注意一次插入不要超过48M,向.zip和大图片什么的尽量用静态存储,MongoDB存储静态路径就好,这也算是一个规则。
循环插入数据
var startTime = (new Date()).getTime(); //得到开始时间
var db = connect('log'); //链接数据库
//开始循环
for(let i=0;i<1000;i++){db.test.insert({num:i});
}var runTime = (new Date()).getTime()-startTime;//计算时间差
print ('This run this is:'+runTime+'ms');//打印出来 507ms
复制代码
批量插入数据
var startTime = (new Date()).getTime();
var db = connect('log');var tempArray = [] //声明一个数组
for(let i=0;i<1000;i++){ //循环向数组中放入值tempArray.push({num:i});
}
db.test.insert(tempArray) //批量一次插入var runTime = (new Date()).getTime()-startTime;
print ('This run this is:'+runTime+'ms'); // 17ms
复制代码
修改数据的错误点 插入数据文件demo02.js
var db = connect('log')var webwork = {name: 'xiaoling',age: 18,sex: 0,skill: {skillOne: 'html',skillTwo: 'javascript',skillThree: 'node'}
}
var webwork1 = {name: 'list',age: 18,sex: 0,skill: {skillOne: 'html',skillTwo: 'javascript',skillThree: 'node'}
}
var webwork2 = {name: 'wangwu',age: 18,sex: 0,skill: {skillOne: 'html',skillTwo: 'javascript',skillThree: 'node'}
}
var workmoney = [webwork, webwork1, webwork2]
db.workspace.insert(workmoney)print('The data was inserted successfully.')
复制代码
错误点:只update修改项
正确的:demo03.js可以声明一个变量,然后把要改变数据的全部信息放入变量,最后执行修改操作。
var db = connect('log')var webwork2 = {name: 'chenming',age: 18,sex: 0,skill: {skillOne: 'html',skillTwo: 'javascript',skillThree: 'node'}
}db.workspace.update({name: 'xiaoling'
}, webwork2)print('[update] the data was updated successfully')
复制代码
需要删除(db.workmate.drop())表中的数据,因为MinJie这个用户已经不在数据库中了,然后重新使用load方法载入插入数据再进行修改。然后执行 db.workmate.drop() load('./demo02.js') load('./demo03.js')
update修改器
- 输入db.workspace.update,可以看到update函数接收4个参数,query,fields,upsert,multi,其中第一个查询和第二个修改提交是必填
- $set 用来修改一个指定的键值(key)
dbd .workmate.update({"name":"MinJie"},{"$set":{sex:2,age:21}})
复制代码
- 修改嵌套内容(内嵌文档)
db.workmate.update({"name":"MinJie"},{"$set":{"skill.skillThree":'word'}})
复制代码
- $unset用于将key值删除
db.workmate.update({"name":"MinJie"},{$unset:{"age":''}})
复制代码
- $inc对数字计算
db.workspace.update({name: 'list'}, {$inc: {age: -2}})
复制代码
- multi: true对所有的数据插入一个健值,true,全部加,false只加一条
db.workspace.update({}, {$set: {birth: ''}}, {multi: true})
复制代码
- upsert也有两个值:true代表没有就添加,false代表没有不添加(默认值)。
db.workspace.update({name: 'xiaoling'}, {age: 15, sex: 1}, {upsert: true})
复制代码
我就是这么一遍遍的测试的
update:数组修改器
- $push 追加数组/内嵌文档值
// db.workspace.update({name: 'xiaoling'}, {$push: {interest: 'draw'}}) // 为数组追加一条
复制代码
- $ne 查找是否存在,不存在就执行,存在就不执行
db.workspace.update({name:'xiaoling',interest:{$ne:'computer'}},{$push:{interest:'computer'}}) // $ne 判断是否存在,存在不执行,不存在执行
复制代码
$addToSet 查找是否存在,不存在就push上去
$each 批量追加
var interestList = ['sleep','music','computer','code'];
db.workspace.update({name:'xiaoling'},{$addToSet:{interest:{$each:interestList}}})
复制代码
$pop只删除一次,并不是删除所有数组中的值。而且它有两个选项,一个是1和-1。
1:从数组末端进行删除
-1:从数组开端进行删除
db.workspace.update({name:'xiaoling'},{$pop:{interest:-1}}) // $pop 删除数组值,-1从开端删除,1从末端删除
复制代码
数组定位修改
有时候只知道修改数组的第几位,但并不知道是什么,这时候我们可以使用interest.int 的形式。
db.workspace.update({name:'xiaoling'},{$set:{"interest.3":'work'}}) //根据数组的定位修改,interest.int
复制代码
应答式操作
非应答式操作即:在操作完数据库后,它给我们任何的回应和返回值
应答式写入:就会给我们直接返回结果(报表),结果里边的包含项会很多,这样我们就可以很好的进行程序的控制和安全机制的处理。有点像前端调用后端接口,无论作什么,后端都要给我一些状态字一样。
db.runCommand() 数据库运行命令的执行器,执行命令首选就要使用它
db.listCommands() 查看所有的Commad命令
db.runCommand({ping:1}) 查看是否和数据库连接成功
findAndModify 配置它可以在修改后给我们返回修改的结果
- 属性值
- query: 需要查询的条件/文档
- sort: 进行排序
- new[boolean]:返回更新前的文档还是更新后的文档
- fields:需要返回的字段
- upsert:没有这个值是否增加
- remove[boolean]:是否删除查找到的文档,true,可以删除
- update: 查找到修改,跟remove只能有1个
var myModify = {findAndModify: 'workspace',query: {age: 15},update: {$set: {name: 'xiaoling'}},new: true,upsert: true
}
var resultMessage = db.runCommand(myModify)
printjson(resultMessage) // 输出json
复制代码
查找:find的不等修饰符
- db.集合.find(要查找的内容,查找的条件)
db.workspace.find({'skill.skillOne': 'html'},{name: true, 'skill.skillTwo': 1, _id: 0}
) // 0 代表false,1代表true
复制代码
- 不等修饰符
- 小于($lt):英文全称less-than
- 小于等于($lte):英文全称less-than-equal
- 大于($gt):英文全称greater-than
- 大于等于($gte):英文全称greater-than-equal
- 不等于($ne):英文全称not-equal
db.workspace.find({age: {$lte: 30, $gte: 25}},{name: true, age: true, 'skill.skillOne': true, _id: false}
)
复制代码
查找:find的多条件查询
- nin
db.workspace.find({age: {$in: [25, 30]}}, {_id: 0})
复制代码
- $or 或者修饰符
db.workspace.find({$or: [{age: {$gte: 30}}, {'skill.skillTwo': 'javascript'}]},{_id: 0}
)
复制代码
- $and 需要同时满足
db.workspace.find({$and: [{age: {$gte: 30}}, {'skill.skillTwo': 'javascript'}]},{_id: 0}
)
复制代码
- not修饰符不能应用在条件语句中,只能在外边进行查询使用。
db.workspace.find({age:{$not:{$lte:30,$gte:20}}
},
{name:1,"skill.skillOne":1,age:1,_id:0}
)
复制代码
查找:find的数组查询
- db.workspace.find({interest:[]}) // 中括号代码完全匹配
- $all-数组多项查询
db.workspace.find({interest:{$all:['看电影','看书']}})
复制代码
- in主要满足数组中的一项就可以被查出来
db.workspace.find({interest:{$in:['看电影','旅游']}})
复制代码
- $size-数组个数查询
db.workspace.find({interest:{$size:5}})
复制代码
- $slice-显示选项
db.workspace.find({},{name:1,interest:{$slice:2},_id:0}) // 查找所有的数据,只展示兴趣的前2条信息
复制代码
查找:find的参数使用方法
- query:这个就是查询条件,MongoDB默认的第一个参数。
- fields:(返回内容)查询出来后显示的结果样式,可以用true和false控制是否显示。
- limit:返回的数量,后边跟数字,控制每次查询返回的结果数量。
- skip:跳过多少个显示,和limit结合可以实现分页。
- sort:排序方式,从小到大排序使用1,从大到小排序使用-1。
实现分页的demo,将limit和skip结合起来
db.workspace.find({},{name:true,age:true,_id:false}).limit(2).skip(0).sort({age:1});
复制代码
- where修饰符的使用
db.workspace.find({$where:'this.age>30'},{name:true,age:true,_id:false}) // where查询,this指的是workspace集合
复制代码
find在js中正常显示
游标
- hasNext()
var db = connect('log') // 链接集合log
var result = db.workspace.find({interest: {$size: 5}}) //查询 声明result,把查询结果赋值给result
//利用游标的hasNext()进行循环输出结果。
// while (result.hasNext()) {
// printjson(result.next())
// }
或者利用foreach
result.forEach(function(result){printjson(result)
})
复制代码
索引
db.集合.getIndexes() 查看索引
db.集合.ensureIndex({username:1}) 建议索引
什么情况不需要使用索引?
- 数据不超万条时,不需要使用索引。性能的提升并不明显,而大大增加了内存和硬盘的消耗。
- 查询数据超过表数据量30%时,不要使用索引字段查询。实际证明会比不使用索引更慢,因为它大量检索了索引表和我们原表。
- 数字索引,要比字符串索引快的多,在百万级甚至千万级数据量面前,使用数字索引是个明确的选择。
- 把你经常查询的数据做成一个内嵌数据(对象型的数据),然后集体进行索引。
复合索引
加入现在再建立一个索引,查询的时候就是复合索引查询, MongoDB的复合查询是按照我们的索引顺序进行查询
自定义索引顺序hint
var rs = db.test.find({username: 'p3octakdxkn1u', randNum0: 169770}).hint({randNum0: 1, username: 2}) // MongoDB的复合查询是按照我们的索引顺序进行查询,用我们自己指定的索引优先查询,这个方法就是hint()
复制代码
删除索引
db.集合.dropIndex('username_1') // 索引的唯一Id,索引的唯一id不是我们的字段名称而是索引查询表中的name
全文索引
- db.info.ensureIndex({contextInfo:'text'}) // text代表全文索引
- 全文索引查找
- $text:表示要在全文索引中查东西。
- $search:后边跟查找的内容。
var db = connect('log')
// db.info.insert({
// contextInfo:
// 'I am a programmer, I love life, love family. Every day after work, I write a diary.'
// })
// db.info.insert({
// contextInfo:
// 'I am a programmer, I love PlayGame, love drink. Every day after work, I playGame and drink.'
// })var rs = db.info.find({$text: {$search: 'PlayGame'}})
rs.forEach(rs => printjson(rs))复制代码
- 查找多个词
// var rs = db.info.find({$text: {$search: 'programmer family diary drink'}}) // 查找多个词
复制代码
- 如果我们这时候希望不查找出来有drink这个单词的记录,我们可以使用“-”减号来取消。
var rs = db.info.find({$text: {$search: 'programmer family diary -drink'}}) // 不希望找到的
复制代码
- 全文搜索中是支持转义符的,比如我们想搜索的是两个词(love PlayGame和drink),这时候需要使用\斜杠来转意
var rs = db.info.find({$text: {$search: '"love PlayGame" drink'}}) // 转义
复制代码
内置角色:
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManage;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
- 内部角色:__system
图形管理界面
只是操作客户端的界面,服务端还是要开启的
下载地址下载好的界面
感谢技术胖的分享视频:技术胖的博客
转载于:https://juejin.im/post/5ce7b947f265da1bb13f0c9d
mongoDB初识一二三相关推荐
- MongoDB 初识
1.什么是MongoDB MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案.主要是海量数据的处理. 2011年是文档数据库的一年,尽 ...
- 阿里P8携手腾讯T4谈微服务架构实战:深入浅出Cloud+boot+Docker
微服务架构:SpringCloud 编辑 添加图片注释,不超过 140 字(可选) 微服务"架构在这几年被广泛传播,变得非常火热,以至于关于微服务架构相关的开源框架和工具都变得越来越活跃 ...
- 他山之石:解读「2022 海外企业内部系统现状」
全文 2278 字 阅读时间约 7 分钟 本文首发于码匠官方博客 目录 技术团队在内部系统上花费大量时间 公司在使用哪些低代码/无代码工具? 从头开发一个内部系统,什么技术栈最受欢迎? 内部系统中最流 ...
- 作为一个Java开发者连Spring三剑客都没吃透,你拿什么和老板谈涨薪?
Spring已然成为Java程序员必修课之一 毋庸置疑,Spring 早已成为 Java 后端开发事实上的行业标准,无数的公司选择 Spring 作为基础的开发框架,大部分 Java 后端程序员在日常 ...
- php是面向对象还是过程,PHP面向过程和面向对象
php程序编写分为面向过程和面向对象.两者在功能实现上没有区别,但是在代码编写上区别很大,面向过程的代码很乱,不易管理,而面向对象把常用的功能封装为一个类,这样代码清楚多了. 下面举个小例子说明一下: ...
- Mongodb数据库初识
Mongodb数据库初识 一.什么是数据库 1.标准定义 2.数据库的概念 3.数据库的简单理解 4.使用数据库的原因 ①普通文件系统存储大量数据的问题 ②数据库的高效性 二.数据库的分类 1.关系型 ...
- mongodb 搜索速度_初识 MongoDB 数据库
初识 MongoDB 数据库 前言 Flask 基础框架在之前的三篇文章中写完了.想要学习 web 相关的同学可以自己回顾翻一下,相信看完了,你也可以写出来一个简单的小案例来炫耀一波! 说到 web ...
- 头歌 初识MongoDB
初识MongoDB 第1关:启动 MongoDB 第2关:启动 MongoDB 多实例 第3关:退出客户端和关闭 MongoDB 服务 第1关:启动 MongoDB cd /data mkdir my ...
- MongoBD 系列(1) —— 初识 MongoDB
初识 MongoDB 文章目录 初识 MongoDB 什么是MongoDB? MongoDB 的安装 1. 传统二进制安装 2. Docker 安装 MongoDB 的使用 1. MongoDB 结构 ...
最新文章
- 微软提出极低资源下语音合成与识别新方法,小语种不怕没数据!| ICML 2019
- 影像组学视频学习笔记(31)-柱状图的python实现、Li‘s have a solution and plan.
- python这个软件学会能做什么工作-学会Python后都能做什么?网友们的回答简直不要太厉害...
- JavaScript -- Window-Interval
- python的主要版本_Python目前主要有( )两个主要版本。_学小易找答案
- Xamarin效果第十三篇之弹窗PopupPage
- JS进阶之---函数,立即执行函数
- excel教程自学网_想学习PS和视频剪辑,自学,有哪些好的学习网站和资源吗?
- Mongoose介绍和入门​​
- 【java】swing窗口及继承的应用
- 机器学习基础算法28-EM算法
- 软件需求分析(补发)
- Android 开机底层优化
- linux 查看定时任务
- 使用docker运行mysql:5.7
- 如何查到营业执照_知道法人姓名,如何查营业执照?
- Win10便签删除了怎么恢复?便签删除了的恢复方法
- 计算机操作系统的加密与恢复,当在 Windows中设置 FIPS 兼容策略时,BitLocker 的恢复密码Windows...
- 超详细dns劫持解决办法分享
- 智能电视如何测试软件,智能电视屏幕如何快速识别好坏?教你几招!
热门文章
- Android 测试教程
- React Native
- 信号与系统:快速傅里叶变换FFT中的实际频率(奈奎斯特频率解析)
- python项目实践_Python 项目实践三(Web应用程序)第二篇
- 利用mysql做信息管理_利用MySql实现学生信息管理系统的后台数据管理
- java标志清理_JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)...
- 软考高项之质量管理-攻坚记忆
- java怎样循环写数组按钮_java – 将按钮变量声明为带有for循环android的数组
- 传值类型_what?你竟然不知道C#中的方法及参数的类型解析!那还不快来瞅瞅
- openstack上传镜像失败_制作云window10镜像