选择server => MongoDB Community Server(商业版) => 选择64位的下载javascript
安装一路回车,我这里安装到了C:\Program Files\MongoDB\Server\4.0\binhtml
配置环境变量前端
启动服务端,启动服务的命令的文件是:mongod.exejava
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
将会输出服务端相关信息,包括版本,数据库所在路径,监听端口号,数据库大小等等、看到这个说明你已经成功了,默认端口是27017node
查看存在数据库命令:mongo show dbs
查看数据库版本命令:mongo db.version()
复制代码
若是有数听说明安装成功mysql
mongo shell 若是之前接触过数据库必定知道每一个数据库都有本身独特的命令,MSSQL和MYsql用的都是Sql命令,MongoDB的操做命令就是前端最熟悉的JavaScript命令web
操做前你须要打开Mongo服务器和连接到服务器-也就是咱们的mongod命令和mongo命令sql
var x='Hello World'
print(x)
复制代码
这里的输出命令不是console.log,而是printmongodb
输入函数,输入一半时会有3个点表示没输完的语句能够继续输shell
之前咱们的关系型数据库的数据结构都是顶层是库,库下面是表,表下面是数据。可是MongoDB有所不一样,库下面是集合,集合下面是文件,能够看下面这张图进行了解一下。
mongoddb(非关系型数据库) | mysql(关系型数据库) |
---|---|
文件(document) | 行(row) |
集合(collections) | 表(table) |
数据库(databases) | 数据库(databases) |
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')
dbd .workmate.update({"name":"MinJie"},{"$set":{sex:2,age:21}})
复制代码
db.workmate.update({"name":"MinJie"},{"$set":{"skill.skillThree":'word'}})
复制代码
db.workmate.update({"name":"MinJie"},{$unset:{"age":''}})
复制代码
db.workspace.update({name: 'list'}, {$inc: {age: -2}})
复制代码
db.workspace.update({}, {$set: {birth: ''}}, {multi: true})
复制代码
db.workspace.update({name: 'xiaoling'}, {age: 15, sex: 1}, {upsert: true})
复制代码
我就是这么一遍遍的测试的
// db.workspace.update({name: 'xiaoling'}, {$push: {interest: 'draw'}}) // 为数组追加一条
复制代码
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 配置它能够在修改后给咱们返回修改的结果
var myModify = {
findAndModify: 'workspace',
query: {age: 15},
update: {$set: {name: 'xiaoling'}},
new: true,
upsert: true
}
var resultMessage = db.runCommand(myModify)
printjson(resultMessage) // 输出json
复制代码
db.workspace.find(
{'skill.skillOne': 'html'},
{name: true, 'skill.skillTwo': 1, _id: 0}
) // 0 表明false,1表明true
复制代码
db.workspace.find(
{age: {$lte: 30, $gte: 25}},
{name: true, age: true, 'skill.skillOne': true, _id: false}
)
复制代码
db.workspace.find({age: {$in: [25, 30]}}, {_id: 0})
复制代码
db.workspace.find(
{$or: [{age: {$gte: 30}}, {'skill.skillTwo': 'javascript'}]},
{_id: 0}
)
复制代码
db.workspace.find(
{$and: [{age: {$gte: 30}}, {'skill.skillTwo': 'javascript'}]},
{_id: 0}
)
复制代码
db.workspace.find({
age:{
$not:{
$lte:30,
$gte:20
}
}
},
{name:1,"skill.skillOne":1,age:1,_id:0}
)
复制代码
db.workspace.find({interest:{$all:['看电影','看书']}})
复制代码
db.workspace.find({interest:{$in:['看电影','旅游']}})
复制代码
db.workspace.find({interest:{$size:5}})
复制代码
db.workspace.find({},{name:1,interest:{$slice:2},_id:0}) // 查找全部的数据,只展现兴趣的前2条信息
复制代码
实现分页的demo,将limit和skip结合起来
db.workspace.find({},{name:true,age:true,_id:false}).limit(2).skip(0).sort({age:1});
复制代码
db.workspace.find({$where:'this.age>30'},{name:true,age:true,_id:false}) // where查询,this指的是workspace集合
复制代码
游标
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}) 建议索引
什么状况不须要使用索引?
加入如今再创建一个索引,查询的时候就是复合索引查询, MongoDB的复合查询是按照咱们的索引顺序进行查询
var rs = db.test
.find({username: 'p3octakdxkn1u', randNum0: 169770})
.hint({randNum0: 1, username: 2}) // MongoDB的复合查询是按照咱们的索引顺序进行查询,用咱们本身指定的索引优先查询,这个方法就是hint()
复制代码
db.集合.dropIndex('username_1') // 索引的惟一Id,索引的惟一id不是咱们的字段名称而是索引查询表中的name
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'}}) // 查找多个词
复制代码
var rs = db.info.find({$text: {$search: 'programmer family diary -drink'}}) // 不但愿找到的
复制代码
var rs = db.info.find({$text: {$search: '"love PlayGame" drink'}}) // 转义
复制代码
只是操做客户端的界面,服务端仍是要开启的
感谢技术胖的分享视频:技术胖的博客