mongo学习之路
mongodb的安装,在这里就不做介绍了,不管是windows还是mac,网上都有教程,可以自行学习一下~~~
一、启动
mongod
二、链接
mongo
三、关闭链接
db.shutdownServer()
四、命令
1、查看数据库
show dbs
2、进入数据库
use + 数据库名
3、显示数据库中的集合
show collections
4、显示当前位置
db
五、基础操作命令
1、使用数据库
use user
2、新建集合和插入数据文件
db.user.insert({"name": "xiaoying"})
3、查询所有数据
db.user.find()
4、查询第一个文件数据
db.user.findOne()
5、修改文件数据,db.集合.update({查询},{修改})
db.user.update({name: "xiaoying"},{"name":"xiaoying", "age":12})
6、删除文件数据
db.user.remove({name: "xiaoying"})
7、删除整个集合
db.user.drop()
8、删除整个数据库
db.dropDatebase()
以上都是在控制台的操作命令,下边是使用js编写命令。
第一节 模拟登陆日志表信息
--goTask.js--
var userName = 'xiaoying'
var timeSart = Date.parse(new Date())
var jsonDatabase = {
"loginName": userName,
"loginTime": timeSart
}
var db = connect('log') // 相当于use 不能用let声明
db.login.insert(jsonDatabase)
print("[demo] log print success")
打开控制台输入 load('./goTask.js' 执行成功~
load('goTask.js')
connecting to: mongodb://127.0.0.1:27017/log
MongoDB server version: 3.6.5
[demo] log print success
true
查看下插入结果
> db.login.find()
{ "_id" : ObjectId("5c99ab77847a0ad420df98f0"), "loginName" : "xiaoying", "loginTime" : 1553574775000 }
第二节 批量插入的正确姿势
--demo01.js---
// 批量创建用户
var workmate1={
name:'xiaoying',
age:33,
sex:1,
job:'前端',
skill:{
skillOne:'HTML+CSS',
skillTwo:'JavaScript',
skillThree:'PHP'
},
regeditTime:new Date(),
interest:[]
}
var workmate2={
name:'ShengLei',
age:31,
sex:1,
job:'JAVA后端',
skill:{
skillOne:'HTML+CSS',
skillTwo:'J2EE',
skillThree:'PPT'
},
regeditTime:new Date(),
interest:[]
}
var workmate3={
name:'MinJie',
age:18,
sex:0,
job:'UI',
skill:{
skillOne:'PhotoShop',
skillTwo:'UI',
skillThree:'PPT'
},
regeditTime:new Date(),
interest:[]
}
var workmate4={
name:'XiaoWang',
age:25,
sex:1,
job:'UI',
skill:{
skillOne:'PhotoShop',
skillTwo:'UI',
skillThree:'PPT'
},
regeditTime:new Date(),
interest:[]
}
var workmate5={
name:'LiangPeng',
age:28,
sex:1,
job:'前端',
skill:{
skillOne:'HTML+CSS',
skillTwo:'JavaScript',
},
regeditTime:new Date(),
interest:[]
}
var workmate6={
name:'HouFei',
age:25,
sex:0,
job:'前端',
skill:{
skillOne:'HTML+CSS',
skillTwo:'JavaScript',
},
regeditTime:new Date(),
interest:[]
}
var workmate7={
name:'LiuYan',
age:35,
sex:0,
job:'美工',
skill:{
skillOne:'PhotoShop',
skillTwo:'CAD',
},
regeditTime:new Date(),
interest:[]
}
var workmate8={
name:'DingLu',
age:20,
sex:0,
job:'美工',
skill:{
skillOne:'PhotoShop',
skillTwo:'CAD',
},
regeditTime:new Date(),
interest:[]
}
var workmate9={
name:'JiaPeng',
age:29,
sex:1,
job:'前端',
skill:{
skillOne:'HTML+CSS',
skillTwo:'JavaScript',
skillThree:'PHP'
},
regeditTime:new Date(),
interest:[]
}
var workmate10={
name:'LiJia',
age:26,
sex:0,
job:'前端',
skill:{
skillOne:'HTML+CSS',
skillTwo:'JavaScript',
skillThree:'PHP'
},
regeditTime:new Date(),
interest:[]
}
// 使用company数据库
var db=connect('company');
var workmateArray=[workmate1,workmate2,workmate3,workmate4,workmate5,workmate6,workmate7,workmate8,workmate9,workmate10];
// 给company数据库中的workmate表插入数据
db.workmate.insert(workmateArray);
print('[SUCCESS]:The data was inserted successfully');
查看插入结果
>db.workmate.find()
{ "_id" : ObjectId("5c9b2f6650a0b17e32e5a000"), "name" : "xiaoying", "age" : 33, "sex" : 1, "job" : "前端", "skill" : { "skillOne" : "HTML+CSS", "skillTwo" : "JavaScript", "skillThree" : "PHP" }, "regeditTime" : ISODate("2019-03-27T08:08:06.469Z"), "interest" : [ ] }
{ "_id" : ObjectId("5c9b2f6650a0b17e32e5a001"), "name" : "ShengLei", "age" : 31, "sex" : 1, "job" : "JAVA后端", "skill" : { "skillOne" : "HTML+CSS", "skillTwo" : "J2EE", "skillThree" : "PPT" }, "regeditTime" : ISODate("2019-03-27T08:08:06.470Z"), "interest" : [ ] }
{ "_id" : ObjectId("5c9b2f6650a0b17e32e5a002"), "name" : "MinJie", "age" : 18, "sex" : 0, "job" : "UI", "skill" : { "skillOne" : "PhotoShop", "skillTwo" : "UI", "skillThree" : "PPT" }, "regeditTime" : ISODate("2019-03-27T08:08:06.470Z"), "interest" : [ ] }
{ "_id" : ObjectId("5c9b2f6650a0b17e32e5a003"), "name" : "XiaoWang", "age" : 25, "sex" : 1, "job" : "UI", "skill" : { "skillOne" : "PhotoShop", "skillTwo" : "UI", "skillThree" : "PPT" }, "regeditTime" : ISODate("2019-03-27T08:08:06.470Z"), "interest" : [ ] }
{ "_id" : ObjectId("5c9b2f6650a0b17e32e5a004"), "name" : "LiangPeng", "age" : 28, "sex" : 1, "job" : "前端", "skill" : {"skillOne" : "HTML+CSS", "skillTwo" : "JavaScript" }, "regeditTime" : ISODate("2019-03-27T08:08:06.470Z"), "interest" : [ ] }
{ "_id" : ObjectId("5c9b2f6650a0b17e32e5a005"), "name" : "HouFei", "age" : 25, "sex" : 0, "job" : "前端", "skill" : { "skillOne" : "HTML+CSS", "skillTwo" : "JavaScript" }, "regeditTime" : ISODate("2019-03-27T08:08:06.470Z"), "interest" : [ ]}
{ "_id" : ObjectId("5c9b2f6650a0b17e32e5a006"), "name" : "LiuYan", "age" : 35, "sex" : 0, "job" : "美工", "skill" : { "skillOne" : "PhotoShop", "skillTwo" : "CAD" }, "regeditTime" : ISODate("2019-03-27T08:08:06.471Z"), "interest" : [ ] }
{ "_id" : ObjectId("5c9b2f6650a0b17e32e5a007"), "name" : "DingLu", "age" : 20, "sex" : 0, "job" : "美工", "skill" : { "skillOne" : "PhotoShop", "skillTwo" : "CAD" }, "regeditTime" : ISODate("2019-03-27T08:08:06.471Z"), "interest" : [ ] }
{ "_id" : ObjectId("5c9b2f6650a0b17e32e5a008"), "name" : "JiaPeng", "age" : 29, "sex" : 1, "job" : "前端", "skill" : { "skillOne" : "HTML+CSS", "skillTwo" : "JavaScript", "skillThree" : "PHP" }, "regeditTime" : ISODate("2019-03-27T08:08:06.471Z"), "interest" : [ ] }
{ "_id" : ObjectId("5c9b2f6650a0b17e32e5a009"), "name" : "LiJia", "age" : 26, "sex" : 0, "job" : "前端", "skill" : { "skillOne" : "HTML+CSS", "skillTwo" : "JavaScript", "skillThree" : "PHP" }, "regeditTime" : ISODate("2019-03-27T08:08:06.471Z"), "interest" : [ ] }
批量插入性能测试
// 循环插入
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');//打印出来
循环运行时间查看
load('./demo02.js')
connecting to: mongodb://127.0.0.1:27017/log
MongoDB server version: 3.6.5
This run this is:539ms
true
// 批量插入
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');
批量运行时间查看
load('./demo02.js')
connecting to: mongodb://127.0.0.1:27017/log
MongoDB server version: 3.6.5
This run this is:22ms
true
======很明显,批量运行时间远远小于循环插入时间,所以开发过程中肯定是要用批量插入而不是循环插入。======
第三节 修改:update修改器
1、$set修改器
dbd .workmate.update({"name":"MinJie"},{"$set":{sex:2,age:21}})
//修改嵌套内容(内嵌文档 {}类型)
db.workmate.update({"name":"MinJie"},{"$set":{"skill.skillThree":'word'}})
2、$unset 删除key
db.workmate.update({name: 'huahua'},{"$unset":{age:''}})
3、$inc 对数字进行计算
db.workmate.update({name: 'huahua'},{"$inc":{age:+5}})
4、multi选项(boolean类型 true: 表示每条数据都做更改 false:只修改第一条)
db.workmate.update({},{$set:{interset:[]}},{multi:true})
5、upsert选项(true代表没有就添加,false代表没有不添加(默认值))。
db.workmate.update({name:'xiaoWang'},{$set:{age:20}},{upsert:true})
6、$push追加数组/内嵌文档值
db.workmate.update({name:'xiaoWang'},{$push:{interest:'draw'}})
// 内嵌文档push
db.workmate.update({name:'MinJie'},{$push:{"skill.skillFour":'draw'}})
7、$ne查找是否存在(没有则修改,有则不修改)
db.workmate.update({name:'xiaoWang',"interest":{$ne:'playGame'}},{$push:{interest:'Game'}})
8、
ne
db.workmate.update({name:"xiaoWang"},{$addToSet:{interest:"readBook"}})
9、$each 批量追加
var newInterset=["Sing","Dance","Code"];
db.workmate.update({name:"xiaoWang"},{$addToSet:{interest:{$each:newInterset}}})
10、$pop 删除数组值
- 1:从数组末端进行删除
- -1:从数组开端进行删除
db.workmate.update({name:'xiaoWang'},{$pop:{interest:1}}
//数组定位修改
db.workmate.update({name:'xiaoWang'},{$set:{"interest.2":"Code"}})
第四节 应答式操作
db.runCommand( )
它是数据库运行命令的执行器,执行命令首选就要使用它,因为它在Shell和驱动程序间提供了一致的接口。(几乎操作数据库的所有操作,都可以使用runCommand来执行)现在我们试着用runCommand来修改数据库,看看结果和直接用db.collections.update有什么不同。
var myModify = {
findAndModify: "workMate",
query: {name: 'xiaoying'},
update: {$set: {age: 10}},
new: true ////更新完成,需要查看结果,如果为false不进行查看结果
}
var resultMsg = db.runCommand(myModify)
printjson(resultMsg)
运行结果:
load('./demo04.js')
{
"lastErrorObject" : {
"n" : 0,
"updatedExisting" : true // 表示更新完毕
},
"value" : null,
"ok" : 1
}
true
findAndModify的性能是没有直接使用db.collections.update的性能好,但是在实际工作中都是使用它,毕竟要商用的程序安全性还是比较重要的。
findAndModify属性值:
- query:需要查询的条件/文档
- sort: 进行排序
- remove:[boolean]是否删除查找到的文档,值填写true,可以删除。
- new:[boolean]返回更新前的文档还是更新后的文档。
- fields:需要返回的字段
- upsert:没有这个值是否增加。
第五节 查询:find的不等修饰符
// 所有注册时间大于某个时间人
var startDate = new Date('01/01/2018')
db.workmate.find(
{regeditTime: {$gt: startDate}},
{name: 1, "skill.skillOne": 1, _id: 0, age: 1, regeditTime: 1}
)
运行结果
{ "name" : "xiaoying", "age" : 33, "skill" : { "skillOne" : "HTML+CSS" }, "regeditTime" : ISODate("2019-03-27T08:08:06.469Z") }
{ "name" : "ShengLei", "age" : 31, "skill" : { "skillOne" : "HTML+CSS" }, "regeditTime" : ISODate("2019-03-27T08:08:06.470Z") }
{ "name" : "MinJie", "age" : 18, "skill" : { "skillOne" : "PhotoShop" }, "regeditTime" : ISODate("2019-03-27T08:08:06.470Z") }
{ "name" : "XiaoWang", "age" : 25, "skill" : { "skillOne" : "PhotoShop" }, "regeditTime" : ISODate("2019-03-27T08:08:06.470Z") }
{ "name" : "LiangPeng", "age" : 28, "skill" : { "skillOne" : "HTML+CSS" }, "regeditTime" : ISODate("2019-03-27T08:08:06.470Z") }
{ "name" : "HouFei", "age" : 25, "skill" : { "skillOne" : "HTML+CSS" }, "regeditTime" : ISODate("2019-03-27T08:08:06.470Z") }
{ "name" : "LiuYan", "age" : 35, "skill" : { "skillOne" : "PhotoShop" }, "regeditTime" : ISODate("2019-03-27T08:08:06.471Z") }
{ "name" : "DingLu", "age" : 20, "skill" : { "skillOne" : "PhotoShop" }, "regeditTime" : ISODate("2019-03-27T08:08:06.471Z") }
{ "name" : "JiaPeng", "age" : 29, "skill" : { "skillOne" : "HTML+CSS" }, "regeditTime" : ISODate("2019-03-27T08:08:06.471Z") }
{ "name" : "LiJia", "age" : 26, "skill" : { "skillOne" : "HTML+CSS" }, "regeditTime" : ISODate("2019-03-27T08:08:06.471Z") }
// 查找公司小于35大于25的人
db.workmate.find(
{age: {$lt: 35, $gt: 25}},
{name: 1, "skill.skillOne": 1, _id: 0, age: 1}
)
运行结果
{ "name" : "xiaoying", "age" : 33, "skill" : { "skillOne" : "HTML+CSS" } }
{ "name" : "ShengLei", "age" : 31, "skill" : { "skillOne" : "HTML+CSS" } }
{ "name" : "LiangPeng", "age" : 28, "skill" : { "skillOne" : "HTML+CSS" } }
{ "name" : "JiaPeng", "age" : 29, "skill" : { "skillOne" : "HTML+CSS" } }
{ "name" : "LiJia", "age" : 26, "skill" : { "skillOne" : "HTML+CSS" } }
不等修饰符
- 小于($lt):英文全称less-than
- 小于等于($lte):英文全称less-than-equal
- 大于($gt):英文全称greater-than
- 大于等于($gte):英文全称greater-than-equal
- 不等于($ne):英文全称not-equal
第六节 查询:find的多条件查询
1、
nin (不在某个范围)
// 查询同事中年龄是25岁和33岁的信息
db.workmate.find({age:{$nin:[25,33]}},
{name:1,"skill.skillOne":1,age:1,_id:0}
)
运行结果
{ "name" : "xiaoying", "age" : 33, "skill" : { "skillOne" : "HTML+CSS" } }
{ "name" : "XiaoWang", "age" : 25, "skill" : { "skillOne" : "PhotoShop" } }
{ "name" : "HouFei", "age" : 25, "skill" : { "skillOne" : "HTML+CSS" } }
2、$or修饰符
// 条件或 查出两个条件满足其中一个即可
db.workmate.find({$or:[
{age:{$gte:30}},
{"skill.skillThree":'PHP'}
]},
{name:1,"skill.skillThree":1,age:1,_id:0}
)
运行结果
{ "name" : "xiaoying", "age" : 33, "skill" : { "skillThree" : "PHP" } }
{ "name" : "ShengLei", "age" : 31, "skill" : { "skillThree" : "PPT" } }
{ "name" : "LiuYan", "age" : 35, "skill" : { } }
{ "name" : "JiaPeng", "age" : 29, "skill" : { "skillThree" : "PHP" } }
{ "name" : "LiJia", "age" : 26, "skill" : { "skillThree" : "PHP" } }
3、$and修饰符
db.workmate.find({$and:[
{age: {$gt: 30}},
{"skill.skillThree": "PHP"}
]},
{name: 1, 'skill.skillThree':1, age:1, _id: 0}
)
运行结果
{ "name" : "xiaoying", "age" : 33, "skill" : { "skillThree" : "PHP" } }
4、$not修饰符
db.workmate.find({
age: {
$not: {
$lte: 30,
$gte: 20
}
}
},
{name: 1, 'skill.skillOne':1, age: 1, _id: 0}
)
运行结果
{ "name" : "xiaoying", "age" : 33, "skill" : { "skillOne" : "HTML+CSS" } }
{ "name" : "ShengLei", "age" : 31, "skill" : { "skillOne" : "HTML+CSS" } }
{ "name" : "MinJie", "age" : 18, "skill" : { "skillOne" : "PhotoShop" } }
{ "name" : "LiuYan", "age" : 35, "skill" : { "skillOne" : "PhotoShop" } }
今天先更新到这里吧~~~后边继续更新,每天进步一点点,希望对自己和看文章的你都能进步!