Mongodb发展与基本命令

1,107 阅读5分钟

MongoDB是什么(what)

MongoDB 是一个基于分布式文件存储数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

MongoDB解决什么问题?(why)

想要知道MongoDB解决什么问题,首先应该我们去了解一下MongoDB的发展历史。在现在海量数据的互联网时代,传统的关系型数据库(mysql)已经不能满足高平发、易扩展、高性能的要求,于是Nosql(非关系型数据库)应运而生。关系型数据库要满足ACID原则,而非关系型数据库则弱满足事务,让我们了解CAP定理,BASE原则。

CAP定理(CAP theorem)

在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer's theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency)  (所有节点在同一时间具有相同的数据)
  • 可用性(Availability)  (保证每个请求不管成功或者失败都有响应)
  • 分隔容忍(Partition tolerance)  (系统中任意信息的丢失或失败不会影响系统的继续运作)

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:

  • CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
  • CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
  • AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

NoSQL的优点/缺点

优点:

    • 高可扩展性
    • 分布式计算
    • 低成本
    • 架构的灵活性,半结构化数据
    • 没有复杂的关系

缺点:

    • 没有标准化
    • 有限的查询功能(到目前为止)
    • 最终一致是不直观的程序

BASE

BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定义。

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:

  • Basically Available --基本可用
  • Soft-state --软状态/柔性事务。 "Soft state" 可以理解为"无连接"的, 而 "Hard state" 是"面向连接"的
  • Eventually Consistency -- 最终一致性, 也是 ACID 的最终目的。

ACID vs BASE

ACIDBASE
原子性(Atomicity)基本可用(Basically Available) 
一致性(Consistency)软状态/柔性事务(Soft state) 
隔离性(Isolation)最终一致性 (Eventual consistency) 
持久性 (Durable) 

MongoDB怎么使用(how)

MongoDB基本概念

MongoDB与mysql对比理解:

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins 表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

MongoDB基本命令

数据库的创建与删除

数据库创建: use database_name
如果数据库不存在,则创建数据库,否则切换到指定数据库。

数据库删除: db.dropDatabase() => 对象.方法()

所有数据库查询:show dbs => show databases

显示当前正在使用数据库: db

集合的创建与删除

创建集合

显示创建集合:db.createCollection(name, options)

隐式创建集合:在集合插入文档时,集合不存在会自动创建
例如:db.mycol2.insert({"name" : "菜鸟教程"}) mycol2被隐式创建

集合索引

查看索引: db.collection.getIndexes()

创建索引: db.collection_name.createIndex({ "apId" : 1, "module" : 1})

删除索引: db.collection_name.dropIndex()

删除集合

删除集合: db.collection_name.drop();

文档的CRUD

插入文档

单个文档插入:db.collection_name.insert() 或者 db.c0llection_name.save()
升级版:db.collection_name.insertOne()

  • save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne()  或 db.collection.replaceOne()  来代替。
  • insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。

文档批量插入: db.collection_name.insertMany([{},{}])

文档批量插入异常捕做: try { db.collection_name.insertMany() }
catch( e ) { print (e) }


查询文档

查询所有: db.collection_name.find(query,projection)
查询一个: db.collection_name.findOne(query,projection)

  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

AND连接: db.col.find({key1:value1, key2:value2})
db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"})

OR连接:db.col.find({ $or: [ {key1: value1}, {key2:value2} ] } )

AND与·OR联合使用例子: 相当于where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')  
=>
db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB >教程"}]})
type操作符:   
如果想获取 "col" 集合中 title 为 String 的数据,你可以使用以下命令:
db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})

查询多少个: limit()
db.collection_name.find().limit()

查询最开始跳多是个: skip()
db.collection_name.find().skip()

查询排序:在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。 sort()方法基本语法如下所示: db.collection_name.find().sort({KEY:1})

查询集合中一个对象数组里面的属性为某一个值

db.getCollection('order').find({buyList:{$elemMatch: {productId:{$eq: ""}}}})


文档更新

MongoDB 使用 update() 和 save() 方法来更新集合中的文档

update() 方法

update() 方法用于更新已存在的文档。语法格式如下:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如,,inc...)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。

批量更新: updateMany()
update()默认修改第一条数据 如果修改所有: {multi: true} 或者updateMany()

覆盖更新: db.colllection_name.update({_id: "1"},{name: "miao"})
文档除了name字段其它字段全部没了

局部更新: db.collection_name.update({_id,"1"},{$set: {name: "miao"}})
一个大括号将update内容括起来,然后在前面添加美元符号与set

列值增长 : 比如年龄再原有基础上加1
db.collection_name.update({_id: "1"},{$incr: {age: NumberInt(1)}})

值设置为空 db.collection_name.update({"_id":1},{$unset: {mobile:null}})

db.getCollection('user').update({_id:ObjectId("62ab062a75122d265eb33cda")},{$unset:{mobile:null}})

文档删除

文档删除: db.collection_name.remove(条件)