Mac MongoDB安装:
官网下载对应版本:Mac MongoDB下载地址
下载解压至自己需要保存的路径
配置环境变量:
1、打开环境变量open .bash_profile
2、配置环境变量 #mongodb环境变量
export PATH=$PATH:/Users/xx/mongodb/bin
终端运行mongod会提示需要自己在根目录添加一个/data/db
的目录
3、在系统根目录添加一个/data/db
目录
4、终端再次运行mongod
会提示如下代表安装成功:
5、打开浏览器http://localhost:27017
会提示It looks like you are trying to access MongoDB over HTTP on the native driver port.
代表运行成功
6、打开另外一个终端 运行命令行:mongo
即可进入mongodb中
7、输入show dbs
,会显示db中可用的dbs
8、输入db.version()
显示MongoDB的版本
9、要停止MongoDB的时候一定要正确的退出,不然下次再次连接数据库会出现问题,使用下面的两行代码可以完成这一操作.
use admin;
db.shutdownServer();
MongoDB基本语法
show dbs
:显示已有数据库,如果你刚安装好,会默认有local、admin(config),这是MongoDB的默认数据库,我们在新建库时是不允许起这些名称的。
use admin
: 进入数据,也可以理解成为使用数据库。成功会显示:switched to db admin。
show collections
: 显示数据库中的集合(关系型中叫表,我们要逐渐熟悉)。
db
:显示当前位置,也就是你当前使用的数据库名称,这个命令算是最常用的,因为你在作任何操作的时候都要先查看一下自己所在的库,以免造成操作错误。
数据操作基础命令:
use db(建立数据库)
:use不仅可以进入一个数据库,如果你敲入的库不存在,它还可以帮你建立一个库。但是在没有集合前,它还是默认为空。
db.集合.insert( )
:新建数据集合和插入文件(数据),当集合没有时,这时候就可以新建一个集合,并向里边插入数据。
Demo:db.user.insert({"name":"zhangsan"})
db.集合.find( )
:查询所有数据,这条命令会列出集合下的所有数据,可以看到MongoDB是自动给我们加入了索引值的。
Demo:db.user.find()
db.集合.findOne( )
:查询第一个文件数据,这里需要注意的,所有MongoDB的组合单词都使用首字母小写的驼峰式写法。
db.集合.update({查询},{修改})
:修改文件数据,第一个是查询条件,第二个是要修改成的值。这里注意的是可以多加文件数据项的,比如下面的例子。
db.user.update({"name":"zhangsan"},{"name":"lisi","age":"32"})
db.集合.remove(条件)
:删除文件数据,注意的是要跟一个条件。Demo:db.user.remove({“name”:” lisi”})
db.集合.drop( )
:删除整个集合,这个在实际工作中一定要谨慎使用,如果是程序,一定要二次确认。
db.dropDatabase( )
:删除整个数据库,在删除库时,一定要先进入数据库,然后再删除。实际工作中这个基本不用,实际工作可定需要保留数据和痕迹的。
cls
:终端清屏。
使用.js添加mongodb
//task.js
var userName="zhangsan"; //声明一个登录名
var timeStamp=Date.parse(new Date()); //声明登录时的时间戳
var jsonDdatabase={"loginUnser":userName,"loginTime":timeStamp}; //组成JSON字符串
var db = connect('log'); //链接数据库
db.login.insert(jsonDdatabase); //插入数据
print('[demo]log print success');
//test2
// 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');//打印出来 545ms
// test3 优化
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');//打印出来 67ms
运行 mongo task.js
终端在mongo中可以通过load('task.js')
进行加载
批量插入
当我们需要批量插入的时候最好的方法是本地进行数据保存,然后统一插入, forin单条插入会损耗时间的
var workmate1={
name:'zhangsan',
age:33,
sex:1,
job:'mobile',
skill:{
skillOne:'iOS',
skillTwo:'swift',
skillThree:'java'
},
regeditTime:new Date()
}
var workmate2={
name:'ShengLei',
age:30,
sex:1,
job:'JAVA后端',
skill:{
skillOne:'HTML+CSS',
SkillTwo:'J2EE',
SkillThree:'PPT'
},
regeditTime:new Date()
}
var workmate3={
name:'MinJie',
age:20,
sex:1,
job:'UI设计',
skill:{
skillOne:'PhotoShop',
SkillTwo:'UI',
SkillThree:'Word+Excel+PPT'
},
regeditTime:new Date()
}
var db = connect('company');
var workmateArray = [workmate1, workmate2, workmate3];
db.workmate.insert(workmateArray);
print('[SUCCESS]: The data was inserted successfully.');
修改器
当我需要更新数据中某一个参数的数值会通过如下进行修改
var db = connect('company');
var workmate3={
name:'MinJie',
age:20,
sex:0,
job:'UI设计',
skill:{
skillOne:'PhotoShop',
SkillTwo:'UI',
SkillThree:'Word+Excel+PPT+skiach'
},
regeditTime:new Date()
}
db.workmate.update({name:'MinJie'}, workmate3);
但是这样会比较繁琐
MongoDB提供了一些更方便的方法 -- 修改器
$set
修改器
$unset
用于将key删除
$inc
对数字进行计算 操作计算
multi选项
将所有数据添加一个新的参数
upsert选项
在找不到值的情况下,直接插入这条数据
$push
追加数组/内嵌文档值
$ne
查找是否存在
$addToSet
升级版的$ne
$each
批量追加
$pop
删除数组值
var db = connect('company');
var workmate3={
name:'MinJie',
age:20,
sex:0,
job:'UI设计',
skill:{
skillOne:'PhotoShop',
SkillTwo:'UI',
SkillThree:'Word+Excel+PPT+skiach'
},
regeditTime:new Date()
}
db.workmate.update({name:'MinJie'}, workmate3);
//--------------------------------------------
//$set 修改器
//用来修改一个指定的键值(key),
//这时候我们要修改sex和age就非常方便了,只要一句话就可以搞定。
db.workmate.update({name:'MinJie'}, {"$set": {sex:2, age:16}});
db.workmate.update({name:'MinJie'}, {$set: {sex:2, age:16}});
//嵌套key需要加引号
db.workmate.update({name:'MinJie'}, {$set: {"skill.SkillThree":"word"}});
//-----------------------------------------------
// $unset用于将key删除 将age去掉
db.workmate.update({name:'MinJie'}, {$unset: {age:''}});
//需要添加直接用 $set
db.workmate.update({name:'MinJie'}, {$set: {age:20}});
//------------------------------------------------
//$inc对数字进行计算 操作计算
//它是对value值的修改,但是修改的必须是数字,字符串是不起效果的
db.workmate.update({name:'MinJie'}, {$inc: {age:-2}});
//------------------------------------------
//multi选项 将所有数据添加一个新的参数
//这样只能添加一项
db.workmate.update({}, {$set: {interset:[]}});
//正解 (要查找的值, 要选择的项, 选项对象)
//multi是有ture和false两个值,true代表全部修改,false代表只修改一个(默认值)
db.workmate.update({}, {$set: {interset:[]}}, {multi: true});
//--------------------------------------------
//upsert选项
//upsert是在找不到值的情况下,直接插入这条数据。
//upsert也有两个值:true代表没有就添加,false代表没有不添加(默认值)。
db.workmate.update({name:'xiaoWang'},{$set:{age:20}},{upsert:false})
//-----------------------------------------------
//$push追加数组/内嵌文档值
//$push的功能是追加数组中的值,
//但我们也经常用它操作内嵌稳文档,就是{}对象型的值。
db.workmate.update(
{name:'xiaoWang'},
{$push:{interest:'draw'}})
//当然$push修饰符还可以为内嵌文档增加值
db.workmate.update(
{name:'MinJie'},
{$push:{'skill.skillFour':'draw'}})
//$ne查找是否存在
//它主要的作用是,
//检查一个值是否存在,如果不存在再执行操作,存在就不执行,
//没有则修改,有则不修改
db.workmate.update(
{name:'MinJie', interest:{$ne: 'playGame'}},
{$push:{interest:'playGame'}})
//----------------------------------------------
// $addToSet 升级版的$ne
// 它是$ne的升级版本(查找是否存在,不存在就push上去),
//操作起来更直观和方便,所以再工作中这个要比$en用的多。
db.workmate.update(
{name:'xiaoWang'},
{$addToSet:{interest: 'readBook'}})
//----------------------------------------------
// $each 批量追加
//它可以传入一个数组,一次增加多个值进去,
//相当于批量操作,性能同样比循环操作要好很多,
//这个是需要我们注意的,工作中也要先组合成数组,
//然后用批量的形式进行操作。
var newInterset= ['Sing', 'Dance', 'Code'];
db.workmate.update(
{name:'xiaoWang'},
{$addToSet:{interest: {$each: newInterset}}})
//----------------------------------------------
// $pop 删除数组值
//$pop只删除一次,
//并不是删除所有数组中的值。而且它有两个选项,一个是1和-1。
//1:从数组末端进行删除
//-1:从数组开端进行删除
var newInterset= ['Sing', 'Dance', 'Code'];
db.workmate.update({name:'xiaoWang'},{$pop:{interest:1}})
//----------------------------------------------
//数组定位修改
//有时候只知道修改数组的第几位,
//但并不知道是什么,这时候我们可以使用interest.int 的形式。
db.workmate.update(
{name:'xiaoWang'},
{$set:{"interest.2":"Play"}}
)
print('[update]: The data was updated successfully');
findAndModify
在操作数据库时,对数据的修改是需要有足够的安全措施的,其实在实际工作中,我们用db.collections.update的时候不多,在修改时我们都会用findAndModify,它可以给我们返回来一些必要的参数,让我们对修改多了很多控制力,控制力的加强也就是对安全的强化能力加强了。
从名字上就可以看出,findAndModify
是查找并修改的意思。配置它可以在修改后给我们返回修改的结果。
工作中尽量使用findAndModify
来进行更新数据,这样会更安全和直观
findAndModify
属性值:
query
:需要查询的条件/文档
sort
: 进行排序
remove
:[boolean]是否删除查找到的文档,值填写true,可以删除。
new
: [boolean]返回更新前的文档还是更新后的文档。
fields
:需要返回的字段
upsert
:没有这个值是否增加。
var db = connect('company');
//findAndModify是查找并修改的意思。
//配置它可以在修改后给我们返回修改的结果
/*
findAndModify属性值:
query:需要查询的条件/文档
sort: 进行排序
remove:[boolean]是否删除查找到的文档,值填写true,可以删除。
new:[boolean]返回更新前的文档还是更新后的文档。
fields:需要返回的字段
upsert:没有这个值是否增加。
*/
var myModify = {
findAndModify:"workmate",
query:{name:'zhangsan'},
update:{$set: {age:18}},
new:true //更新完成,需要查看结果,如果为false不进行查看结果
}
//(a, b, c, d)
//a 匹配信息
//b 修改内容
//c upsert选项 有不增加 没有增加
//d 把所有的选项都进行修改
// db.workmate.update({sex:1},{$set:{money:1000}},false,true)
//比如我们要查看是否和数据库链接成功了,就可以使用Command命令。
// var resultMessage=db.runCommand({ping:1})
// var resultMessage=db.runCommand({getLastError:1})
// var resultMessage=db.listCommands()
var resultMessage=db.runCommand(myModify);
printjson(resultMessage);
/*
返回信息
{
"connectionId" : 41,
"updatedExisting" : true,
"n" : 2,
"syncMillis" : 0,
"writtenTo" : null,
"err" : null,
"ok" : 1
}
false:第一句末尾的false是upsert的简写,代表没有此条数据时不增加;
true:true是multi的简写,代表修改所有
getLastError:1 :表示返回功能错误,这里的参数很多,
printjson:表示以json对象的格式输出到控制台。
*/