Mongodb基础(一)
Mongodb基础
基础操作
创建数据库
use test
#在test表中插入4条记录
db.test.insert({'name':'Mike','age':20})
db.test.insert({'name':'Jack','age':21})
db.test.insert({'name':'Hallo','age':22})
db.test.insert({'name':'Tike','age':19})
show dbs
为test数据库创建一个用户(角色)
#userAdminAnyDatabase 这个角色只能使用于admin 这个库
use test
db.createUser({user:"test1",pwd:"1234",roles:[{role:"readWrite",db:"test"}]})
#进入test数据库授权
use test
db.auth("test1","1234")
#授权成功返回1


删除数据库
use test2
db.test2.insert({'name':'Mike','age':20})
show dbs
#查看当前数据库名
db
#删除当前数据库
db.dropDatabase()
show dbs
插入多条记录
db.test.insertMany([{name:'Pikaqiu',age:30},{name:'Aoteman',age:20},{name:'Dadaguai',age:83}])
查看文档
db.test.findOne()
db.test.find()
db.test.find({name : "Pikaqiu"})

修改操作
db.test.find({name:'Pikaqiu'})
#修改(第一个参数表示更新条件,第二个参数表示要更新的数据)
db.test.update({name:'Pikaqiu'},{name:'Pikaqiu',age:3})
db.test.find({name:'Pikaqiu'})
#皮卡丘年龄加10
db.test.update(
{"name" : 'Pikaqiu'},
{"$inc": {"age": 10} }
)



删除数据
db.test.remove({name:'hallen'})
修改器
$set(可以用来修改一个字段的值,如果这个字段不存在,则创建它)
首先将要修改的数据赋值给set是一个修改器,后面多了两个参数,第一个false表示如果不存在update记录,是否将我们要更新的文档作为一个新文档插入,true表示插入,false表示不插入,默认为false,第二个true表示是否更新全部查到的文档,false表示只更新第一条记录,true表示更新所有查到的文档。
db.test.update({name:'Pikaqiu'},{$set:{name:'Pikapika'}},false,true)
db.test.update({name:'Pikapika'},{$set:{property:'cute'}},false,true)
db.test.update({age:83},{$set:{property:'sunshine'}},false,true)
db.test.update({age:20},{$set:{property:'young'}},false,true)



$unset可以删除一个字段
db.test.update({},{$unset:{'content':'',author:'',tech:'',characteristics:'',comments:'',students:''}},false, true)
$inc修改器(用来增加已有键的值,如果该键不存在就新创建一个;只能用来操作数字,不能用来操作null、布尔等。)
db.test.update({name:"Pikapika"},{$inc:{"tech.shousand":999}})
db.test.find({name:'Pikapika'})
db.test.update({name:"Pikapika"},{$inc:{"tech.shousand":1}})

数组修改器(push可以向已有数组末尾追加元素,要是不存在就创建一个数组)
db.test.update({name:"Pikapika"},{$push:{characteristics:"特别好看"}},false,true)
db.test.find({name:'Pikapika'})

$each
#一次添加3个特点,可以结合$each一起来使用
db.test.update({name:"Pikapika"},{$push:{comments:{$each:["捏起来比较软","很好😵","比较厉害"]}}})
db.test.find({name:'Pikapika'})

$slice
#使用$slice来固定数组的长度,假设我固定数组的长度为3,如果数组中的元素不足3个,则全部保留,如果数组中的元素超过3个,则只会保留最新的3个
db.test.update({name:"Pikapika"},{$push:{comments:{$each:["Pikapika","很好😵","hello"],$slice:-3}}})
db.test.find({name:'Pikapika'})

$sort
#每个student有姓名和成绩,然后按照成绩降序排列,只要前5条数据
#$sort的取值为-1和1,-1表示降序,1表示升序
db.test.update({name:"Pikapika"},{$push:{students:{$each:[{name:"张三",score:100},{name:"李四",score:99},{name:"早五",score:98}],$slice:5,$sort:{score:-1}}}},false,true)
db.test.find({name:'Pikapika'})

$addToSet(表示要插入的值如果存在则不插入,否则插入)
db.test.update({name:"Pikapika"},{$addToSet:{comments:{$each:["hello","my","world"]}}})
db.test.find({name:'Pikapika'})

$pop(删除数组中的数据)
#1表示从comments数组的末尾删除一条数据,-1表示从comments数组的开头删除一条数据。
db.test.update({name:"Pikapika"},{$pop:{comments:1}})
db.test.find({name:'Pikapika'})
$pull(按条件删除数组中的某个元素)
db.test.update({name:"Pikapika"},{$pull:{comments:"hello"}})
$
#不知道要修改的数据处于数组中的什么位置,以使用$符号来解决(第一个位置可以用comments.0访问)
db.test.update({comments:"很好"},{$set:{"comments.$":"是特别好"}})

文档查询操作
find方法
- 自定义返回的字段,如下表示只返回age字段,其他字段都不返回;如果不想返回
_id,可以设置_id为0
db.test.find({},{age:1,_id:0})
比较运算符
| 符号 | 含义 |
|---|---|
$lt |
< |
$lte |
<= |
$gt |
> |
$gte |
>= |
$ne |
!= |

db.test.find({age:{$lte:100,$gte:80}})

$in
db.test.find({age:{$in:[20,83]}})

$nin
db.test.find({age:{$nin:[20,23]}})

$or
db.test.find({$or:[{age:20},{age:23}]})

$type
db.test.find({age:{$type:1}})

| 类型 | 对应数字 | 别名 | 说明 |
|---|---|---|---|
| Double1 | 1 | double | |
| String | 2 | string | |
| Object | 3 | object | |
| Array | 4 | array | |
| Binary data | 5 | binData | |
| Undefined | 6 | undefined | 弃用 |
| ObjectId | 7 | objectId | |
| Boolean | 8 | bool | |
| Date | 9 | date | |
| Null | 10 | null | |
| Regular Expression | 11 | regex | |
| DBPointer | 12 | dbPointer | |
| JavaScript | 13 | javascript | |
| Symbol | 14 | symbol | |
| JavaScript(with scope) | 15 | javascriptWithScope | |
| 32-bit integer | 16 | int | |
| Timestamp | 17 | timestamp | |
| 64-bit integer | 18 | long | |
| Min key | -1 | minKey | |
| Max key | 127 | maxKey |
$not
db.test.insert({name:'张三',age:'不想告诉你'})
db.test.find({age:{$not:{$type:1}}})

$and
db.test.find({$and:[{age:{$gt:23}},{age:{$lt:84}}]})
#可以简化成下面的语句
db.test.find({age:{$lt:84,$gt:23}})

null
db.test.insert({name:'nalito',age:24})
#会查出property为null的文档,也会查出所有没有property字段的文档
db.test.find({property:null})

db.test.insert({name:'sasigei',age:23,property:null})
db.test.find({property:{$in:[null],$exists:true}})

正则表达式查询(和JavaScript中的正则表达式语法一致)
#查询所有key为name,value以p开始的文档且不区分大小写
db.test.find({name:/^(p)(.[a-zA-Z0-9])+/i})

数组查询
db.test1.insert({"date":'2021-10-15',"books":["三体","狂人日记","朝花夕拾"]})

db.test1.find({books:"朝花夕拾"})


$all
db.test1.find({books:{$all:["朝花夕拾","三体"]}})

db.test1.find({"books.0":"三体"})

db.test1.find({books:{$size:3}})

#想查询数组中的前两条数据,可以使用$slice
db.test1.find({},{books:{$slice:2}})

db.test1.find({},{books:{$slice:[0,2]}})

$elemMatch
db.test2.insert({
"class":"1",
"student":[
{"name":"mac","age":18,"sex":true},
{"name":"jack","age":19,"sex":true},
{"name":"rose","age":20,"sex":false}
]
})
db.test2.find({
"student.name":"mac",
"student.age":20
})

db.test2.find({
"student":{$elemMatch:{"name":"mac","age":18}}
})

#这个时候查找不出记录
db.test2.find({
"student":{$elemMatch:{"name":"mac","age":20}}
})
嵌套文档查询
db.test3.insert({
"class":"1",
"student":{
"name":"mac","age":18,"sex":true
}
})
db.test3.find({student:{name:'mac',age:18,sex:true}})

db.test3.find({"student.name":'mac',"student.age":18,"student.sex":true})
管道操作符

$match
db.test.aggregate({$match:{name:"Pikapika"}})

$project
基本用法
db.test.aggregate({$project:{name:1,_id:0,age:1}})

db.test.aggregate({$project:{"姓名":"$name"}})

数学表达式
use test
db.test4.insert(
{
name:'peanut',
book1:14,
book2:45,
book3:67
}
)

#加法
db.test4.aggregate(
{
$project:{totalMoney:{$add:['$book1','$book2','$book3']}}
}
)

db.test4.update({name:'peanut'},{$set:{折扣:30}},false,true)
#减法
db.test4.aggregate({
$project:{totalPay:{$subtract:[{$add:['$book1','$book2','$book3']},'$折扣']}}
})

#multiply乘法
#freight求商
#mod取模
导出导入数据
- 安装Mongodb tools
wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel70-x86_64-100.5.1.tgz
tar -zxvf mongodb-database-tools-rhel70-x86_64-100.5.1.tgz -C /opt/module
#环境变量设置
#MONGO_TOOLS
export MONGO_TOOLS=/opt/module/mongodb-database-tools-rhel70-x86_64-100.5.1
export PATH=$PATH:$MONGO_TOOLS/bin
source /etc/profile
mongoexport -h localhost:27017 -u用户名 -p密码 --authenticationDatabase=admin -d test -c test --type=csv --fieldFile=/opt/module/test/mongoexport/field.txt -o /opt/module/test/mongoexport/filename.csv

- 导入数据(UTF-8无BOM编码格式)
mongoimport -h localhost:27017 -u 用户名 -p 密码 --authenticationDatabase=admin -d test -c test5 --type=csv --fields=name,age /opt/module/test/mongoexport/filename.csv


浙公网安备 33010602011771号