mongodb初学记录

216 阅读3分钟

我是做前端的,只是被排出来值班,无聊想看看mongodb,在blibli上找到一个蛮新的视频。边看边学边记录一下,也方便以后查阅使用。以操作为主,基本没有理论知识(工作上应该不会用到,所以不想特别去了解理论知识。如果哪天我转全栈的话,再补补理论) blibli mongo学习视频 视频中也有笔记

安装

我使用自己的方式在虚拟机(debain)上安装的。与视频播放不一致。配置了root用户和远程连接

  • 远程登录在 etc/mongod.conf 修改

里面的bindIp:原来是127.0.0.1

同时需要:

  • 设置登录的账号密码(权限) blog.csdn.net/qq_26896281…
  • 重启服务 sudo service mongod restart
  • 本地测试:http://localhost:27017/
  • 最后还做了一步让虚机可以远程登录(可以不用,毕竟可以直接在虚机上输入命令,但是不能复制黏贴,所以使用了Xshell,后面发现直接用powershell也行)好像是安装了SSH。由于没有记录已经忘了。。。不过百度一下可以找回来

官网文档 docs.mongodb.com/manual/tuto…

debain中mongo初始化操作

  • 启动服务
service mongod start
  • 连接数据库(auth)
mongo -u root -p
// 之后会让你输入密码

shell

  • 查看数据库
show dbs
  • 切换数据库
use admin
  • 显示有哪些集合
show collections
  • 显示当前使用的数据库
db
  • 创建数据库
use user
  • 插入数据
db.user.insert({name:"a"})
db.user.insert({name:"b"})
db.user.insert({name:"c"})
  • 查询数据
db.user.find()
  • 查询第一条数据
db.user.findOne()
  • 修改数据
db.user.update({name:"a"},{name:"a",age:18})
  • 删除数据
db.user.remove({name:"a"})
  • 删除数据库
db.user.drop()
// 或者
db.dropDatabase()

修改器

写入模拟数据

var workmate1 = {
    name: 'a',
    age: 33,
    sex: 1,
    job: '前端',
    skill: {
        skillOne: 'ddd',
        skillTwo: 'jjjj',
        skillThree: 'ccc'
    },
    regeditTime: new Date()
}

var workmate2 = {
    name: 'b',
    age: 22,
    sex: 0,
    job: '前端111',
    skill: {
        skillOne: '滴滴滴',
        skillTwo: '去去去',
        skillThree: '呃呃呃'
    },
    regeditTime: new Date()
}

var workmate3 = {
    name: 'c',
    age: 34,
    sex: 1,
    job: 'ddv',
    skill: {
        skillOne: '合伙人',
        skillTwo: 'GRE',
        skillThree: '而他'
    },
    regeditTime: new Date()
}

var workmateArray = [workmate1, workmate2, workmate3]
db.workmate.insert(workmateArray)

修改器操作

// $set 设置
db.workmate.update({ name: 'c' }, { $set: { sex: 0 } })
db.workmate.update({ name: 'c' }, { $set: { "skill.skillThree": '哦哦哦' } })
// $unset 删除
db.workmate.update({ name: 'c' }, { $unset: { age: '' } })

db.workmate.update({ name: 'c' }, { $set: { age: 20 } })

// $inc 
db.workmate.update({ name: 'c' }, { $inc: { age: -2 } })

// multi    批量增加属性
db.workmate.update({}, { $set: { interest: [] } }, { multi: true })

// upsert 如果有就修改,没有就增加
db.workmate.update({ name: 'd' }, { $set: { age: 20 } }, { upsert: true })

// push
db.workmate.update({ name: 'd' }, { $push: { interest: 'draw' } })
db.workmate.update({ name: 'c' }, { $push: { 'skill.skillFour': 'draw' } })

findAndModify:修改后返回数据

// find and modify
var MyModify = {
    findAndModify:"workmate",
    query:{
        name:"d"
    },
    update:{
        $set:{
            age:18
        }
    },
    new:true
}

var resultMessage = db.runCommand(MyModify)
printjson(resultMessage)

查询

// 先清空之前数据
db.workmate.drop()

//插入新的模拟数据:https://jspang.com/posts/2017/12/16/mongodb.html#%E7%AC%AC10%E8%8A%82%EF%BC%9A%E6%9F%A5%E8%AF%A2%EF%BC%9Afind%E7%9A%84%E4%B8%8D%E7%AD%89%E4%BF%AE%E9%A5%B0%E7%AC%A6
var workmate1 = {
    name: 'JSPang',
    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: []
}
var workmateArray = [workmate1, workmate2, workmate3, workmate4, workmate5, workmate6, workmate7, workmate8, workmate9, workmate10];
db.workmate.insert(workmateArray);

根据普通条件查找

db.workmate.find({ "skill.skillOne": "HTML+CSS" })

// 查找所需字段
db.workmate.find(
    { "skill.skillOne": "HTML+CSS" },
    { name: 1, "skill.skillOne": true, _id: 0 }
)

查询修饰符

  • 不等修饰符
// 不等修饰符
db.workmate.find(
    {
        age: {
            $lte: 30,
            $gte: 25
        }
    },
    {
        name: 1,
        "skill.skillOne": 1,
        age: 1,
        _id: 0
    }
)

// 查询日期
var startDate = new Date('01/01/2019')
db.workmate.find(
    {
        regeditTime: {
            $gt: startDate
        }
    },
    {
        name: 1,
        "skill.skillOne": 1,
        age: 1,
        _id: 0
    }
)
  • $in 一个key多value
// $in 一个key多value
db.workmate.find(
    {
        age: {
            $in: [25, 33]
        }
    },
    {
        name: 1,
        "skill.skillOne": 1,
        age: 1,
        _id: 0
    }
)
// $nin 一个key多value
db.workmate.find(
    {
        age: {
            $nin: [25, 33]
        }
    },
    {
        name: 1,
        "skill.skillOne": 1,
        age: 1,
        _id: 0
    }
)
  • $or
// $or
db.workmate.find(
    {
        $or: [
            {
                age: {
                    $gte: 30
                }
            },
            {
                'skill.skillThree': 'PHP'
            }
        ]
    },
    {
        name: 1,
        "skill.skillThree": 1,
        age: 1,
        _id: 0
    }
)
  • $and
// $and
db.workmate.find(
    {
        $and: [
            {
                age: {
                    $gte: 30
                }
            },
            {
                'skill.skillThree': 'PHP'
            }
        ]
    },
    {
        name: 1,
        "skill.skillThree": 1,
        age: 1,
        _id: 0
    }
)
  • $not
// $not
db.workmate.find(
    {
        age: {
            $not: {
                $lte: 30,
                $gte: 20
            }
        }
    },
    {
        name: 1,
        "skill.skillThree": 1,
        age: 1,
        _id: 0
    }
)

数组查询


db.workmate.drop()

var workmate1 = {
    name: 'JSPang',
    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: ['玩游戏', '美食', '篮球']
}

var workmateArray = [workmate1, workmate2, workmate3, workmate4, workmate5, workmate6, workmate7, workmate8, workmate9, workmate10];
db.workmate.insert(workmateArray);
  • 完全匹配
// 查找数组,完全匹配
db.workmate.find(
    {
        interest: ['画画', '聚会', '看电影']
    },
    {
        name: 1,
        interest: 1,
        age: 1,
        _id: 0
    }
)
  • 查询数组中的一个
// 查询数组中的一个
db.workmate.find(
    {
        interest: '画画'
    },
    {
        name: 1,
        interest: 1,
        age: 1,
        _id: 0
    }
)

  • 数组中的几个 $all
// 数组中的几个 $all
db.workmate.find(
    {
        interest: {
            $all: ['看电影', '看书']
        }
    },
    {
        name: 1,
        interest: 1,
        age: 1,
        _id: 0
    }
)
  • 其他修饰符
// $in
db.workmate.find(
    {
        interest: {
            $in: ['看电影', '看书']
        }
    },
    {
        name: 1,
        interest: 1,
        age: 1,
        _id: 0
    }
)
  • 数组数量
// $size
db.workmate.find(
    {
        interest: {
            $size: 5
        }
    },
    {
        name: 1,
        interest: 1,
        age: 1,
        _id: 0
    }
)
  • 只显示第一项
// 只显示第一项 $slice
db.workmate.find(
    {
        interest: {
            $size: 3
        }
    },
    {
        name: 1,
        interest: {
            $slice: 1
        },
        age: 1,
        _id: 0
    }
)
  • 分页 显示两个 年龄从小到大
// 分页 显示两个 年龄从小到大
db.workmate.find(
    {},
    { name: true, age: true, _id: false }
).limit(2).skip(0).sort({ age: 1 })
  • $ where
// $ where

db.workmate.find(
    {
        $where: "this.age>30"
    },
    { name: true, age: true, _id: false }
)
  • hasNext
// hasNext
var results = db.workmate.find();

results.forEach(result=>{
    printjson(result)
})

索引

// 生成随机数
function GetRandomNum(min, max) {
    let range = max - min;
    let rand = Math.random()
    return (min + Math.round(rand * range))
}

// 生成随机用户名
function GetRandomUserName(min, max) {
    let tempStringArray = "1234567890qwertyuiopasdfghjklzxcvbnm".split("")
    let outputtext = ""
    for (let i = 1; i < GetRandomNum(min, max); i++) {
        outputtext = outputtext + tempStringArray[GetRandomNum(0, tempStringArray.length)]
    }
    return outputtext
}

// console.log(GetRandomUserName(6,16))

// 200万条数据
// console.time(a)
var tempInfo = []
db.randomInfo.drop();
for(let i = 0 ; i < 2000000; i++){
    tempInfo.push({
        username:GetRandomUserName(7,16),
        regediteTime:new Date(),
        randNum0:GetRandomNum(100000,999999),
        randNum1:GetRandomNum(100000,999999),
        randNum2:GetRandomNum(100000,999999),
        randNum3:GetRandomNum(100000,999999),
        randNum4:GetRandomNum(100000,999999),
        randNum5:GetRandomNum(100000,999999),
        randNum6:GetRandomNum(100000,999999),
        randNum7:GetRandomNum(100000,999999),
        randNum8:GetRandomNum(100000,999999),
        randNum9:GetRandomNum(100000,999999)
    })
}

db.randomInfo.insert(tempInfo)
// console.timeEnd(a)
  • 没有索引时,查询时间
var startTime = new Date().getTime();

var rs = db.randomInfo.find({username:'a8wjnundefined8zlql'})
rs.forEach(r=>{
    printjson(r)
})


var runtime = new Date().getTime() - startTime;
print(runtime)
  • 建立索引
// 建立索引
db.randomInfo.ensureIndex({username:1})

  • 组合索引
// 组合索引
db.randomInfo.ensureIndex({randNum0:1})
  • 完成索引后,看查询时间
var startTime = new Date().getTime();

// hint 改变索引顺序。索引顺序根据 db.randomInfo.getIndexes()的顺序
var rs = db.randomInfo.find({username:'ya2yg8gd3',randNum0:817427,}).hint({randNum0:1})
rs.forEach(r=>{
    printjson(r)
})


var runtime = new Date().getTime() - startTime;
print(runtime)
  • 删除索引
// 删除索引 根据 db.randomInfo.getIndexes()中的name
db.randomInfo.dropIndex('randNum0_1')

全文索引

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."})

db.info.ensureIndex({contextInfo:'text'})


// 需要查找的字用空格隔开,如果排除某个关键字使用“-”
db.info.find({
    $text:{
        $search:"programmer family diary -drink"
    }
})

// 如果单词本身就有空格的话,那么就用“\”转译
db.info.find({
    $text:{
        $search:"\"love PlayGame\" drink"
    }
})