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

在Robo3T中连接数据库

插入数据

删除数据库

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

search

update 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)

image-20211016160204934

创建新字段

修改之后是这样的

$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}})

inc修改器

数组修改器(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'})

slice

$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'})

image-20211016164748476

$addToSet(表示要插入的值如果存在则不插入,否则插入)

db.test.update({name:"Pikapika"},{$addToSet:{comments:{$each:["hello","my","world"]}}})
db.test.find({name:'Pikapika'})

addToSet

$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}})

筛选年龄大于等于80小于等于100的

$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}}})

用来执行取反操作,比如我想要查询所有age的类型不为数字的文档

$and

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

查询年龄大于23小于84的

null

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

想查询property为null的数据

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

如果只想查询property为null的字段,多加一个条件,判断一下这个字段存在不

正则表达式查询(和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:"朝花夕拾"})

查找

查询books中含有朝花夕拾的文档

$all

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

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

可以按照下标匹配

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

查询数组长度为3的文档

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

想查询数组中的前两条数据,可以使用$slice

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

查询数组的第1个到第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}}
})

image-20211016201441623

#这个时候查找不出记录
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})

管道操作符

test集合

$match

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

获取集合中所有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
}
)

image-20211018205551729

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

image-20211018210103887

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

image-20211018210725996

#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

导入成功

posted @ 2021-11-01 20:49  不会写代码的花生  阅读(55)  评论(0)    收藏  举报