拉取镜像:
docker pull mongo:6.0.2
创建容器:
docker run --name mongo -d -p 27017:27017 mongo:6.0.2
设置用户名和密码:
# 创建mongo容器后,进入容器
docker exec -it mongo bash
# 进入mongo shell
mongosh
# 进入admin数据库
use admin
# 创建用户名和密码
db.createUser({user:'zhangdapeng',pwd:'zhangdapeng520',roles:[{role:'root',db:'admin'}]})
校验用户名和密码:
# 认证登录db.auth('用户名','密码'),打印1则代表认证通过
db.auth('zhangdapeng','zhangdapeng520')
创建数据库:
use db;
查看所有数据库:
show dbs
插入一条数据,再查看所有数据库:
db.db.insertOne({"name":"张大鹏"})
show dbs
删除数据库:
db.dropDatabase()
show dbs
集合相当于一张表,创建一张user集合:
use test
db.createCollection("user")
查看所有的集合:
show collections
创建固定集合 mycol,整个集合空间大小 6142800 B, 文档最大个数为 10000 个。
db.createCollection("mycol", {capped: true, autoIndexId: true, size: 6142800, max: 10000 })
show collections
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
db.mycol2.insert({"name" : "张大鹏"})
show collections
删除集合:
db.mycol2.drop()
show collections
向user集合中新增张三:
db.user.insert({name: '张三', age: 22})
show collections
查询所有的用户:
db.user.find()
向user集合中新增李四:
db.user.insertOne({name: '李四', age: 24})
db.user.find()
向user集合中新增赵六和田七:
db.user.insertMany([{name: '赵六', age: 26},{name: '田七', age: 27}])
db.user.find()
update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
将张三修改为张三333:
db.user.find()
db.user.update({'name':'张三'},{$set:{'name':'张三333'}})
db.user.find()
只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
db.user.updateOne({"name":"李四"},{$set:{"age":34}})
db.user.updateMany({"age":{$gt:30}},{$set:{"age":33}})
删除张三:
db.user.find()
db.col.remove({'name':'张三'})
db.user.find()
删除张三333:
db.user.find()
db.user.deleteOne({'name':'张三333'})
db.user.find()
删除李四:
db.user.find()
db.user.deleteMany({'name':'李四'})
db.user.find()
删除年龄大于30的用户:
db.user.deleteMany({"age":{$gt:30}})
删除赵六:
db.user.find()
db.user.findOneAndDelete({'name':'赵六'})
db.user.find()
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | { } |
db.col.find({"by":"张三"}).pretty() |
where by = '张三' |
小于 | { |
db.col.find({"likes":{$lt:50}}).pretty() |
where likes < 50 |
小于或等于 | { |
db.col.find({"likes":{$lte:50}}).pretty() |
where likes <= 50 |
大于 | { |
db.col.find({"likes":{$gt:50}}).pretty() |
where likes > 50 |
大于或等于 | { |
db.col.find({"likes":{$gte:50}}).pretty() |
where likes >= 50 |
不等于 | { |
db.col.find({"likes":{$ne:50}}).pretty() |
where likes != 50 |
and运算:
db.col.find({key1:value1, key2:value2}).pretty()
or运算:
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
查询名字叫张三的:
# 删除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '张三', age: 23},{name: '赵六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查询
db.user.find({"name":"张三"})
查询年龄小于30的:
# 删除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '张三', age: 23},{name: '赵六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查询
db.user.find({"age":{$lt:30}})
查看年龄小于30且大于25的:
# 删除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '张三', age: 23},{name: '赵六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查询
db.user.find({"age":{$lt:30,$gt:25}})
查看名字叫张三或者名字叫李四的:
# 删除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '张三', age: 23},{name: '赵六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查询
db.user.find({$or:[{"name":"张三"},{"name":"l"}]})
每页2条数据,查询第2页:
# 删除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '张三', age: 23},{name: '赵六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查询
db.user.find().limit(2).skip(2)
根据年龄排序,每页2条数据,查询第2页:在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
# 删除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '张三', age: 23},{name: '赵六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查询
db.user.find().sort({}).limit(2).skip(2)
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { s u m : " sum : " sum:"likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { a v g : " avg : " avg:"likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m i n : " min : " min:"likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m a x : " max : " max:"likes"}}}]) |
$push | 将值加入一个数组中,不会判断是否有重复的值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { p u s h : " push: " push:"url"}}}]) |
$addToSet | 将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { a d d T o S e t : " addToSet : " addToSet:"url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", first_url : { f i r s t : " first : " first:"url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", last_url : { l a s t : " last : " last:"url"}}}]) |
这里我们介绍一下聚合框架中常用的几个操作:
查询用户总数:
# 删除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '张三', age: 23},{name: '赵六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查询
db.user.countDocuments()
查询用户平均年龄:
# 删除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '张三', age: 23},{name: '赵六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查询用户数量和平均年龄
db.user.aggregate([{$group:{_id: null, total_num: {$sum:1},total_avg: {$avg: "$age"}}}])