数据库的查询

show dbs

show dbs 查看所有数据库

db

db 查看当前数据库
MongoDB默认使用的数据库是test

数据库的创建

use 数据库名

注意:use 只是切换,不会立即创建。必须插入数据后数据库才真正存在
只用use 数据库名,数据库只存在内存中,没有持久化。需要在数据库内插入数据,数据存在磁盘中,数据持久化

【示例】

use articledb

数据库的删除

db.dropDatabase()

删除当前使用的数据库
返回结果{ ok: 1, dropped: ‘数据库名’ } 表示成功删除数据库


集合的查询

show collections

查看当前数据库下的所有集合

集合的创建

db.createCollection('集合名')

在当前使用的数据库中显式创建集合 插入数据的同时可以隐式创建集合
MongoDB中的集合相当于关系型数据库中的表

集合的删除

db.集合名.drop()

删除指定的集合 返回true 表示成功删除集合


文档的查询

db.集合名.find()

查看当前集合下的所有文档数据

db.集合名.find({field: value})

根据条件查询当前集合下的所有文档数据

db.集合名.findOne()

查看当前集合下的一条文档数据

db.集合名.findOne({field: value})

根据条件查询当前集合下的一条文档数据

db.集合名.find(
	{field: value},        #过滤条件
	{field: 1, field: 0})    #指定字段

投影查询指定查询显示结构;默认_id会显示;field: 1显示该字短,field: 0不显示该字段
注意:投影查询需要添加在find()添加过滤条件语句。即使无过滤条件,也要写上{}

db.集合名.find(/正则表达式/)

MongoDB的模糊查询是通过正则表达式的方式实现

db.集合名称.find({ field : { $gt: value }}) // 大于: field > value 
db.集合名称.find({ field : { $lt: value }}) // 小于: field < value 
db.集合名称.find({ field : { $gte: value }}) // 大于等于: field >= value 
db.集合名称.find({ field : { $lte: value }}) // 小于等于: field <= value 
db.集合名称.find({ field : { $ne: value }}) // 不等于: field != value

文档的比较查询

文档的插入

db.集合名.insert(文档)

向集合插入一条文档数据 文档相当于关系型数据库的一行数据(row)
如果数据库中该集合不存在,自动创建该集合再插入数据

【示例一】
db.comment.insert({"articleid":"100000","content":"今天天气真好,阳光明 媚","userid":"1001","nickname":"Rose","createdatetime":new Date(),"likenum":NumberInt(10),"state":null})
db.集合名.insertMany([文档,文档,...,文档])

批量插入多条文档数据

【示例二】
db.comment.insertMany([ {"_id":"1","articleid":"100001","content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我 他。","userid":"1002","nickname":"相忘于江湖","createdatetime":new Date("2019-08- 05T22:08:15.522Z"),"likenum":NumberInt(1000),"state":"1"}, {"_id":"2","articleid":"100001","content":"我夏天空腹喝凉开水,冬天喝温开水","userid":"1005","nickname":"伊人憔 悴","createdatetime":new Date("2019-08-05T23:58:51.485Z"),"likenum":NumberInt(888),"state":"1"}, {"_id":"3","articleid":"100001","content":"我一直喝凉开水,冬天夏天都喝。","userid":"1004","nickname":"杰克船 长","createdatetime":new Date("2019-08-06T01:05:06.321Z"),"likenum":NumberInt(666),"state":"1"}, {"_id":"4","articleid":"100001","content":"专家说不能空腹吃饭,影响健康。","userid":"1003","nickname":"凯 撒","createdatetime":new Date("2019-08-06T08:18:35.288Z"),"likenum":NumberInt(2000),"state":"1"}, {"_id":"5","articleid":"100001","content":"研究表明,刚烧开的水千万不能喝,因为烫 嘴。","userid":"1003","nickname":"凯撒","createdatetime":new Date("2019-08- 06T11:01:02.521Z"),"likenum":NumberInt(3000),"state":"1"} ]);

文档的修改

db.集合名.updateOne(
	{field: value},         # 过滤条件
	{$set: {field:value}}   # 修改语句
)  

根据条件修改一条数据指定的字段

示例
db.comment.updateOne(
	{_id: "1"},
	{$set: {nickname: "李四"}}
)
db.集合名.updateMany(
	{field: value},         # 过滤条件
	{$set: {field:value}}   # 修改语句
)  

根据条件修改所有数据的指定字段

示例
db.comment.updateMany(
	{userid: "1003"},
	{$set: {nickname: "李四"}}
)

文档的删除

db.集合名.remove(
	{field: value}  #过滤条件
)

根据条件删除文档数据

db.集合名.remove({})

注意:删除所有数据。请慎用

文档的统计

db.集合名.countDocuments()    

统计所有文档数量

db.集合名.countDocuments(
	{field: value}  #过滤条件
)

按条件统计所有文档数量

文档的分页

db.集合名.find().skip().limit()

skip() 跳过指定数量的数据 limit() 限制返回查询结果的数量

文档的排序

db.集合名.find().sort({field: value})

field: 1 升序;field: -1 降序


索引的查询

db.集合名.getIndexes()

查看现有的索引,返回一个集合中的所有索引的数组。

索引的创建

db.集合名.createIndex({field: options})

field: 1 升序索引 field: -1降序索引 索引也是个集合

索引的删除

db.集合名.dropIndex("index_name")

通过索引名称删除

db.集合名.dropIndex({ age: 1 })

通过索引定义删除

db.集合名.dropIndexs()

删除所有索引 _id 这个索引不会被删除

索引的执行计划

db.集合名.find({field: value}).explain("executionStats")

不传参 只返回查询计划,不实际执行;
"executionStats" 实际执行并返回详细统计数据;
"allPlansExecution" 返回所有候选计划的执行情况;

索引的覆盖查询

db.users.find(
  { field: 1, _id: 0 }
).explain("executionStats")

查询所需的所有字段都包含在索引中,MongoDB 直接从索引返回结果,不需要再去读取文档本身。
必须排除 _id,否则需要回文档取数据