Mac MongoDB学习(-)

Mac MongoDB安装:

官网下载对应版本:Mac MongoDB下载地址

下载解压至自己需要保存的路径

配置环境变量:

1、打开环境变量open .bash_profile
2、配置环境变量 #mongodb环境变量

export PATH=$PATH:/Users/xx/mongodb/bin
终端运行mongod会提示需要自己在根目录添加一个/data/db的目录

3、在系统根目录添加一个/data/db目录
在系统根目录添加一个/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:终端清屏。

db操作基础命令

使用.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对象的格式输出到控制台。
*/

你可能感兴趣的:(Mac MongoDB学习(-))