我的mongo学习之路

464 阅读7分钟

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、addToSet 升级版的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、in修饰符<-->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" } }

今天先更新到这里吧~~~后边继续更新,每天进步一点点,希望对自己和看文章的你都能进步!