(十二)学习笔记:MongoDB数据库总结

MongoDB数据库

MongoDB将数据存储为文档 数据结构由键值对组成的,MongoDB的文档类似于json对象 字段的值可以是文档, 数组以及文档数组(包含多个文档的数组)

MongoDB和MySQL概念的区别:

SQL概念 MongoDB概念 解释说明
database database 数据库
table(表) collection(集合) 数据库的表/集合
row(一行数据) document(文档) 数据记录的行/文档
column field(域) 字段的列/域
index index 索引
table joins 表的联查
primary key primary key 主键/MongoDB自动将_id作为主键

主键

  1. 文档中的键值都是有序的
  2. MongoDB区分大小写
  3. 不能有重复的键, 再次插入会被覆盖掉
  4. 文档的键为字符串的类型

一. 启动MongoDB数据库

(1) cd mongodb/bin目录
(2) mongod.exe --dbpath = 数据库的安装位置(我的在db/data目录)
(3) 开启一个新的终端
(4) cd mongodb/bin目录
(5) mongo.exe 启动数据库

二. 对于mongo数据库的操作

(1) 查看数据库
show dbs;
(2) 创建或选择数据库
use 库名;
注意:
1.如果库不存在,使用这个语句会创建数据库
2.如果数据库存在,则进行数据库的切换
3.数据库创建出来使用show dbs;不会显示出来,需要在数据库中插入内容,才能查看到。
(3) 查看当前所在的数据库
(1) 直接输入db
(2) db.getName()
(4) 创建集合
db.createCollection('集合名称')
(5)查看当前的集合
show collections;
(6) 插入文档
db.集合名.insert({'键':'值'})
例如: db.user.insert({'name':'zs', age:18, gender:'male'})
注意:
1,在MongoDB中,对于集合, 文档的操作统一使用db
2,严格区分大小写
3,如果往不存在的集合插入数据,数据插入成功集合被创建
(7) 删除集合
db.集合名.drop()
例如: db.user.drop();
(8) 删除数据库
db.dropDatabase();

三.insert/save文档的添加

(1) insert就是纯添加数据
db.集合名.insert({文档})
(2) insert插入多条数据
db.集合名.insert([{文档1},{文档2},...])
注意:
如果不加[],调用insert不会报错, 但是只有第一条数据能够插入成功。
(3) 版本3.x以后推荐使用的方法
3.1) db.集合名.insertOne()
例如: db.user.insertOne({'name':'ls','age':20,'gender':'female'}) # 如果写多个文档, 也只有第一个文档会被成功插入
3.2) db.集合名.insertMany()
例如: db.user.insertMany([{'name':'aa'},{'name':'bb'}])
3.3) 使用save
save()方法 既可以插入文档,又可以覆盖文档。

  • 插入文档
    db.user.save({文档})
  • 覆盖文档
    db.user.save({"_id":ObjectId("5a5f0d610e0a34c28cb79342"), name:'芙蓉姐姐'}) # 将原来的id对应的值进行覆盖,原来的文档删除了, _id 一定要写上ObjectId("xxx"), 当save指定唯一_id的时候为覆盖 否则为添加文档

四. MongoDB的条件操作符

$gt 大于  db.集合名.find({age:{$gt:10}})  # 查找年龄大于10的记录
$gte 大于等于  db.集合名.find({age:{$gte:10}})  # 查找年龄大于等于10的记录
$lt 小于  db.集合名.find({age:{$lt:10}})  # 查找年龄小于10的记录
$lte 小于等于  db.集合名.find({age:{$lte:10}})  # 查找年龄小于等于10的记录
{key: value}  等于  db.集合名.find({age:10})  # 查询年龄为10的记录
$ne  不等于  db.集合名.find({age:{$ne:10}})  # 查询年龄不等于10的记录
使用id进行查询  db.集合名.find({"_id":ObjectId("5a5eef3...")})
/数据/  包含查询  db.集合名.find({name:/张/})  # 名字包含张的记录
/^数据/  以..开头  db.集合名.find({name:/^张/})  # 以张为开头的记录
/数据$/  以..结尾  db.集合名.find({name:/四$/})  # 查询以四结尾的记录
$in  在..里   db.集合名.find({age:{$in:[10,20,30]}})  # 查询年龄的值为10,20,30的记录
$nin  不在..里   db.集合名.find({age:{$nin:[10,20,30]}})  # 查询年龄不为10,20,30的记录

五. update更新文档

语句主体结构:

db.集合名.update(
  <query>,
  <update>,
  {
      upsert:<boolean>,
      multi:<boolean>
  }
)
解释:
<query>:update的查询语句,有点类似sql的where后面的条件
<update>:更新操作。 其中 $inc累加修改;  $set直接修改
upsert:当修改的数据不存在的时候是否作为新的数据插入,默认为false
multi:当查询条件查询到多条数据的时候,是修改一条数据还是修改多条数据,默认false只修改一条 

实例:对people集合进行操作
(1) 首先在数据库中插入数据


(2) 将名字为张三的第一条数据年龄修改为18
db.people.update({name:'张三'},{$set:{age: 28}})

(3) 当查询条件不能匹配到数据的时候,不会对任何数据进行修改

(4) 如果将upsert设置为true,当查询条件不能匹配到数据的时候,执行插入操作

(5) update语句默认是对一条记录进行修改的,我们可以设置multi:true用于对多条记录进行修改, 在这里我们将所有名字以张开头的人的年龄加10岁

(6) 和可以使用与操作,将名字为张开头,年龄为29的减10岁

版本3.x以后推荐使用的方法

  • db.集合名.updateOne() # 修改一条记录
    例如: db.people.updateOne({age:{$in:[38,19]}}, {$inc:{age:10}}) # 可以匹配到多条数据,但是只会修改一条数据,如果设置multi为true也只会修改一条数据
  • db.集合名.updateMany() # 修改多条数据
    例如:db.people.updateMany({age:{$in:[38,19]}}, {$inc:{age: 10}}) # 修改了多条数据

六. find查询

(1) 查询所有记录
db.集合名.find();
(2) 查询结果指定某个字段进行显示或不显示
db.集合名.find(条件, {name:1, age:true}); # 只返回指定的字段,默认_id是返回的。即返回_id, name和age对应的字段, 使用1或者true都可以
db.集合名.find({}, {name:false, age:0}); # 返回除了name和age的其他字段

注意:
(1) db.集合名.find({}, {name:true, age:false}); # error 错误的写法, 一般情况下,显示和不显示模式不能混用, 上述name只返回name, age返回除了age以外的,产生错误。
(2) db.集合名.find({}, {_id: 0, name: true, age:true}); # ok _id默认是显示的,需要手动设置为0/false才会隐藏显示

(3) 查询一条记录
db.集合名.findOne(); # 返回了第一条数据
(4) 统计数据条数
db.集合名.find().count();
(5) 将数据展开来查看
db.集合名.find().pretty();
(6) 排序
db.集合名.find().sort({'age':1}); # 其中1为升序, -1为降序
(7) 指定数量的记录
db.集合名.find().sort({age:1}).limit(4); # 安装age升序排序取前4个
(8) 跳过指定数量的记录
db.集合名.find().skip(2); # 跳过2条数据

六. remove删除

(1) 使用remove() 删除
语法格式:

db.集合名.remove(
  <query>,
  {
    justOne:<boolean>,
  }
)
解释:
<query>:查询条件
justOne:设置true/1 是否只删除一个,默认为false

# 删除title为aa的
db.集合名.remove({'title':'aa'})
# 删除所有的文档
db.集合名.remove({})

(2) 使用deleteOne() 和deleteMany() 删除

# 删除集合下的所有文档
db.集合名.deleteMany({})
# 删除title为aa的全部文档
db.集合名.deleteMany({'title':'aa'}) 
# 删除title为aa的第一条文档
db.集合名.deleteOne({'title':'aa'})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容