MongoDB数据库
目录
数据库操作
-
查询数据库版本
db.version()
-
切换数据库
use test # use 库名
-
显示当前数据库
db.getName()
-
查询所有数据库
show dbs
-
查看clsn数据库当前状态
use clsn; db.stats()
MongoDB查询文档
1. 简单查询
1.1 find方法
-
find方法:以非结构化的方式来显示所有文档
db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"}).pretty() # 可以通过pretty()方法以格式化的方式来显示所有文档 db.table.find().pretty()
-
findOne()方法,只返回一个文档
1.2 比较运算符
-
使用比较运算符查询
运算符 说明 $gt
大于 $lt
小于 $gte
大于等于 $lte
小于等于 $ne
不等于 db.集合名.find({'字段名': {'比较运算符': 'value', '运算符2': 'value2'}}) 例:db.students.find({'age': {$gte: 18, $lt: 19}})
1.3 逻辑运算符
-
and条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件
db.table.find({"by":"xx教程", "title":"MongoDB 教程"}).pretty()
以上实例中类似于 WHERE 语句:WHERE by='xx教程' AND title='MongoDB 教程'
-
or条件
使用关键字
$or
db.table.find( { $or: [ {key1: value1}, {key2: value2}.. ] } ).pretty() 例: 1. db.students.find({$or: [{'age': 18}, {'name': 'chen'}]}) # 查询age为18的或者name为chen的数据 2. db.students.find({$or: [{'text': {$exists: true}}, {'name': 'chen'}]}) # 与exists关键字连用,查询存在text字段的数据或name=chen的数据
-
and 和 or 联合使用
db.table.find( {'key1': {$gt:50}, $or: [ {'key2': 'value2'}, {'key3': 'value3'} ]} ).pretty() # 查询key1大于50并且 key2=value2 或者key3=value3的数据
1.4 关键字查询
1.4.1 in / not in 关键字
db.students.find({'age': {$in: [14, 16, 18]}}) # 查询年龄是14,16,18的数据
db.students.find({'age': {$nin: [18, 19]}}) # 查询年龄不是18,19的数据
1.4.2 size关键字
对于值为list类型的字段,可以通过size关键字 对list的长度进行判断
db.students.find({'hobby': {$size: 3}}) # 查询hobby字段的值长度为3的数据类型
1.4.3 exists 关键字
判断数据是否存在某个字段 (exists: true | false, true or false 均为小写)
db.students.find({'hobby': {$exists: true}})
1.5 模糊查询
db.集合名.find({'text': js表达式})
1.6 结果排序
db.students.find({}, {'name': 1, 'age': 1}).sort({'name': 1, age': -1})
1.7 限制结果条数
db.sheet.find({}, {'no': 1, 'addtime': 1}).sort({'addtime':-1}).skip(3).limit(5)
1.8 统计返回结果数量
db.sheet.find({}, {'no': 1, 'addtime': 1}).count()
注:db.sheet.find({}, {'no': 1, 'addtime': 1}).skip(1000).count(true)使用skip时,需要加true,才可以返回正确的数量,否则还是所有数量
2. 高级查询
2.1 aggregate() 管道的使用
db.集合名.aggregate([{管道1: {表达式1}}, {管道2: {表达式2}, {管道3.。。}])
# 如果只有一个管道,可以将[] 去掉
# 在aggregate函数中,数据会依次通过管道进行处理过滤!!!
常用管道
管道 | 说明 |
---|---|
$group | 将集合中的文档分组,可用于统计结果 |
$match | 过滤数据,输出符合条件的数据 |
$project | 修改输出的文档结构 |
$sort | 排序 |
$limit | 限制管道返回的文档数 |
$skip | 跳过指定数量的文档,并返回余下的文档 |
$unwind | 将数组类型的字段进行拆分 |
2.1.1 $group
常用聚合函数
函数 | 说明 |
---|---|
\(sum | 计算总和,\)sum:1 统计数量,\(sum: '\)字段名' 计算字段值的总和 | |
$avg | 计算平均值 |
$min | 获取最小值 |
$max | 获取最大值 |
$push | 在结果文档中插入值到一个数组中 |
$first | 根据文档的排序获取第一个文档数据 |
$last | 根据文档的排序获取最后一个文档数据 |
db.集合名.aggregate(
{$group: {_id: '$字段名', 别名: {$聚合函数: '$字段名'}
)
示例:
# 1. 统计男女生人数
db.students.aggregate({$group: {
_id: '$sex',
count_sex: {$sum: 1}
})
# 2. 计算班级中所有学生的平均年龄, 最大年龄,最小年龄,因为是计算所有学生,不用分组,所以__id: null
db.students.aggregate({
$group: {
_id: null,
avg: {$avg: $'age'},
min_age: {$min, $'age'},
max_age: {$max, $'age'},
}
})
2.1.2 $match
过滤操作
语法:
db.集合名.aggregate(
{$match: {'键名': {表达式}}}
)
# 1. 查找age大于40岁的数据
db.students.aggregate(
{$match:
{'age': {$gt: 40}}
}
)
2.1.3 $sort
排序
# 根据姓名升序 1,年龄降序排序 -1
db.students.aggregate(
{$sort: {'name': 1, 'age': -1}}
)
2.1.4 $projects
在 MongoDB 中可以使用 "$project" 来控制数据列的显示规则,可以执行的规则如下:
普通列({成员:1 | true}):表示要显示的内容
_id
列({"_id
":0 | false}):表示 "_id" 列是否显示
条件过滤列({成员:表达式}):满足表达式之后的数据可以进行显示
2.1.5 $unwind
$unwind会将值为数组(列表)的字段进行拆分,数组中的每个值都与该行数据的其他字段组成一行新的数据。
> db.singer.find({"name":"刘德华"})
————————————————————————————————
{ "_id" : ObjectId("5db78dcb25fcb93e108d6dcb"), "num" : "1", "name" : "刘德华", "country" : "中国", "sex" : "男", "age" : 55, "score" : 100, "works" : [ "爱你一万年", "忘情水", "来生缘", "我不够爱你" ], "description" : "1961年9月27日出生于中国香港" }
# 将刘德华的works字段拆分
db.singer.aggregate([
{$match:{"name":"刘德华"}},
{$unwind:"$works"}
]);
——————————————————————————————
{ "_id" : ObjectId("5db78dcb25fcb93e108d6dcb"), "num" : "1", "name" : "刘德华", "country" : "中国", "sex" : "男", "age" : 55, "score" : 100, "works" : "爱你一万年", "description" : "1961年9月27日出生于中国香港" }
{ "_id" : ObjectId("5db78dcb25fcb93e108d6dcb"), "num" : "1", "name" : "刘德华", "country" : "中国", "sex" : "男", "age" : 55, "score" : 100, "works" : "忘情水", "description" : "1961年9月27日出生于中国香港" }
{ "_id" : ObjectId("5db78dcb25fcb93e108d6dcb"), "num" : "1", "name" : "刘德华", "country" : "中国", "sex" : "男", "age" : 55, "score" : 100, "works" : "来生缘", "description" : "1961年9月27日出生于中国香港" }
{ "_id" : ObjectId("5db78dcb25fcb93e108d6dcb"), "num" : "1", "name" : "刘德华", "country" : "中国", "sex" : "男", "age" : 55, "score" : 100, "works" : "我不够爱你", "description" : "1961年9月27日出生于中国香港" }
2.2 管道的组合使用
# 1. 查询年龄大于30的男女生人数
db.students.aggregate([
{$match: {'age': {$gt: 30}}},
{$group: {_id: '$sex', count_sex: {$sum: 1}}}
])
# 2. 查询年龄在25岁以下的年龄第二第三小的人
db.students.aggregate([
{$match: {'age': {$lt: 25}}}, # 首先筛选25岁以下的人
{$project: {_id: 0, name: 1, age: 1}}, # 调整显示结构, 注意_id是默认显示的,所以_id置为0
{$sort: {'age': 1}}, # 按年龄进行升序排序
{$skip: 1}, # 跳过第一条数据
{$limit: 2} # 过滤出前两个数据
])
MongoDB修改文档
-
修改
# 根据手机号修改日期 db.user_info.update({phoneno: '12000000014'}, {$set:{effectiveEndDate: '2021-8-25'}}, { multi: false, upsert: false} ) // multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。 // upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入