我是做前端的,只是被排出来值班,无聊想看看mongodb,在blibli上找到一个蛮新的视频。边看边学边记录一下,也方便以后查阅使用。以操作为主,基本没有理论知识(工作上应该不会用到,所以不想特别去了解理论知识。如果哪天我转全栈的话,再补补理论) blibli mongo学习视频 视频中也有笔记
安装
我使用自己的方式在虚拟机(debain)上安装的。与视频播放不一致。配置了root用户和远程连接
- 远程登录在 etc/mongod.conf 修改

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