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,不插入
    
posted @ 2021-10-02 21:38  Z-J-H  阅读(80)  评论(1)    收藏  举报