MongoDB(快速入门) 学习笔记

MongoDB学习

数据库分类

关系型数据库(RDBMS)

  • 关系型数据库遵循ACID规则

  • 特性

    • A (Atomicity) 原子性

    • C (Consistency) 一致性

    • I (Isolation) 独立性

    • D(Durability)持久性

  • 关系型数据库中全是表

  • MySQL 、Oracle、DB2、SQL Server……

非关系型数据库(NO SQL)

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

  • NO SQL – Not Only SQL

  • NO SQL 用于超大规模数据的存储

  • MongoDB 、Redis……

  • 键值对数据库

  • 文档数据库MongoDB

ACMD VS BASE

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

MongoDB 简介

  • MongoDB 是一个开源文档数据库,提供高性能、高可用性和自动扩展的功能。MongoDB 是用 C++ 语言编写的非关系型数据库。
  • MongoDB 是为了快速开发互联网Web应用而设计的数据库系统
  • MongoDB 的设计目标是极简、灵活、作为Web应用栈的一部分
  • MongoDB 的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB 这个数据库中存的是各种各样的JSON。(BSON)
  • BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。

MongoDB 概念解析

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

    数据库是一个仓库,在仓库中可以存放多个集合

  • 集合

    集合类似于数组,在集合中可以存放文档

  • 文档

    1.文档数据库中的最小单位,存储和操作的内容都是文档

    2.在MongoDB中,数据库和文档均不需要手动创建,当我们创建文档时,如果数据库和集合不存在则会自动创建数据库和集合

MongoDB 数据库细化

  • 数据库的服务器端

    服务器用来保存数据

    mongod用来启动服务器

  • 数据库的客户端

    客户端用来操作服务器

    mongo用来启动客户端

MongoDB 基本指令

指令作用
show dbs显示当前的所有数据库
show databases同 show dbs
use DATABASES_NAME(数据库名)进入到指定的数据库中(如果数据库不存在,则创建数据库,否则切换到指定数据库。)
db显示当前所处的数据库
show collections显示数据库中所有的集合
db.stats()统计数据信息

删除集合

db.collections.drop()

删除数据库

db.dropDatabase()

MongoDB 插入文档

db..insert()

  • collections 集合名–如何集合不存在则会自动在当前数据库下创建集合并插入文档

  • 插入一个或多个文档

  • 当插入文档时,若未指定 _id 属性则数据库会自动为文档添加 _id 属性来作为文档的唯一标识

  • 当自己指定 _id 时应保证 _id 的唯一性

  • 语法:

    db.collection.insert(
    <document or array of documents>,
    {
        writeConcern: <document>,    //可选字段
        ordered: <boolean>    //可选字段
    }
    )
    

    参数:

    参数表示可设置插入一条或多条文档。writeConcern: 参数表示自定义写出错的级别,是一种出错捕捉机制。

    ordered: 是可选的,默认为 true。

    ​ true,在数组中执行文档的有序插入,并且如果其中一个文档发生错误,MongoDB 将返回而不处理数组中的其余文档;

    ​ false,则执行无序插入,若其中一个文档发生错误,则忽略错误,继续处理数组中的其余文档。

//插入一个
db.users.insert({name:"zhangsan",age:"32"})
db.users.find({})
/*
* {
*  "_id" : ObjectId("6013a3cccb67494036ad2a8a"),
*   "name" : "zhangsan",
*   "age" : "32"
* }
*/

//插入多个(数据应为数组)
db.users.insert([{name:"lisi",age:"35"},{name:"wangwu",age:"23"}])
db.users.find({})
/*
* {
*   "_id" : ObjectId("6013a5fccb67494036ad2a8c"),
*   "name" : "lisi",
*   "age" : "35"
* }
* {
*   "_id" : ObjectId("6013a5fccb67494036ad2a8d"),
*   "name" : "wangwu",
*   "age" : "23"
* }
*/

//将数据定义为变量插入
document = ({
    name:"zhaoliu",
    age:"65"
})
db.users.insert(document)
db.users.find({})
/*
* {
*   "_id" : ObjectId("6013a904cb67494036ad2a8e"),
*   "name" : "zhaoliu",
*   "age" : "65"
* }
*/

3.2 以后新增插入命令,用法同上:

db..insertone()

  • 插入单个文档

db..insertmany()

  • 插入多个文档

MongoDB 查询文档

db..find()

  • find()用来查询集合中所有符合条件的文档

  • 参数

    {} – 查询所有文档

    {属性名:属性值 } – 查询指定值的文档

  • 返回值为一个数组

特定类型查询

  • pretty() 方法以格式化的方式来显示所有文档
  • limit(number) 方法用于限制查询结果的个数
  • skip(number) 方法用于略过指定个数的文档
  • sort({排序字段:1}) 用于对查询结果进行排序,1 升序,-1 降序
  • count() 用于查询所有结果的数量

投影

  • db.collections.find({},{想要显示的字段:1}); //1显示
  • db.collections.find({},{想要显示的字段:0}); //0不显示
//查询所有
db.users.find()
/*
* |           _id            | name     | age  |
* | :----------------------: | -------- | ---- |
* | 6013ad62cb67494036ad2a93 | zhangsan | 3    |
* | 6013ad63cb67494036ad2a94 | lisi     | 35   |
* | 6013ad63cb67494036ad2a95 | wangwu   | 23   |
* | 6013ad67cb67494036ad2a96 | zhaoliu  | 65   |
*/

//查询lisi
db.users.find({name:"lisi"})
/*
* | 6013ad63cb67494036ad2a94 | lisi     | 35   |
*/


3.2 以后新增用法,用法同上

db..findOne()

  • 用来查询符合条件的第一个文档
  • 返回值是一个文档对象
db.users.findOne({age:"23"}).name
//wangwu

查询条件

操作符格式实例与 RDBMS where 语句比较
等于(=){ : {}}db.test.find( {price : 24} )where price = 24
大于(>){ : {$gt : }}db.test.find( {price : {$gt : 24}} )where price > 24
小于(<){ : {$lt : }}db.test.find( {price : {$lt : 24}} )where price < 24
大于等于(>=){ : {$gte : }}db.test.find( {price : {$gte : 24}} )where price >= 24
小于等于(<=){ : {$lte : }}db.test.find( {price : {$lte : 24}} )where price <= 24
不等于(!=){ : {$ne : }}db.test.find( {price : {$ne : 24}} )where price != 24
与(and){key01 : value01, key02 : value02, …}db.test.find( {name : “《MongoDB 入门教程》”, price : 24} )where name = “《MongoDB 入门教程》” and price = 24
或(or){$or : [{key01 : value01}, {key02 : value02}, …]}db.test.find( {$or:[{name : “《MongoDB 入门教程》”},{price : 24}]} )where name = “《MongoDB 入门教程》” or price = 24

MongoDB 修改(更新)文档

db.collections.update(查询条件,新对象,{

​ upsert,
​ multi,
​ writeConcern,
​ collation

})

  • update()默认会使用新对象来替换旧对象

  • 默认只会修改一个

  • 修改指定属性

    $set 修改文档中的指定属性

    $unset 用来删除文档的指定属性

  • 参数

    upsert:为布尔型可选项,表示如果不存在 update 的记录,是否插入这个新的文档。true 为插入;默认为 false,不插入。

    multi:也是布尔型可选项,默认是 false,只更新找到的第一条记录。如果为 true,则把按条件查询出来的记录全部更新。

    writeConcem:表示出错级别。

    collation:指定语言。

//用上方案例

//修改 name为zahngsan 的年龄修改为18
db.users.update({name:"zhangsan"},{$set:{age:"18"}})
// | 6013ad62cb67494036ad2a93 | zhangsan | 18   |

3.2 以后新增用法,同上

db.collections.updateOne()

  • 修改一个符合条件的文档

db.collections.updateMany()

  • 同时修改多个符合条件的文档

MongoDB 删除文档

db.collection.remove(
,
{
justOne: , writeConcern:
}
)

  • 参数

    query:必选项,是设置删除的文档的条件。

    justOne:布尔型的可选项,默认为false,删除符合条件的所有文档,如果设为 true,则只删除一个文档。

    writeConcem:可选项,设置抛出异常的级别。

//用上边案例

//删除name为zhangsan所有的文档
db.users.remove({name:"zhangsan"})

db.collections.deleteOne()

  • 删除一个

db.collections.deleteMany()

  • 删除全部

MongoDB 文档关系

一对一(One to One)

  • 如夫妻(郭靖/黄蓉)
  • 在 MongoDB 中可以通过内嵌文档的形式来体现一对一的关系
db.WifeAndHusband.insert(
	{
        wife:"HR",
        husband:{name:"GJ"}
    }
)
db.WifeAndHusband.find()

/*
* {
*   "_id" : ObjectId("6013c3afcb67494036ad2a9b"),
*   "wife" : "HR",
*   "husband" : {
*     "name" : "GJ"
*   }
* }
*/

一对多(One to Many) / 多对一(Many to One)

  • 如 用户–多个订单 、文章 – 多个评论 、黄瓜 – 水果蔬菜等

  • 可以使用内嵌文档对映射一对多关系

  • _idusername
    ObjectId(“6013c7e0cb67494036ad2a9d”)孙悟空
    ObjectId(“6013c7e0cb67494036ad2a9e”)猪八戒
//用户 users 和订单 orders
db.users.insert([{username:"孙悟空"},{username:"猪八戒"}])
db.users.find()
/*
* | _id                                  | username |
* | ------------------------------------ | -------- |
* | ObjectId("6013c7e0cb67494036ad2a9d") | 孙悟空   |
* | ObjectId("6013c7e0cb67494036ad2a9e") | 猪八戒   |
*/

db.orders.insert({list:["西瓜","桃子","橘子"],userId:ObjectId("6013c7e0cb67494036ad2a9d")})
db.orders.find()
/*
* {
*   "_id" : ObjectId("6013c836cb67494036ad2a9f"),
*   "list" : ["西瓜", "桃子", "橘子"],
*   "userId" : ObjectId("6013c7e0cb67494036ad2a9d")
* }
*/

//查询用户孙悟空的订单
var user_id = db.users.findOne({username:"孙悟空"})._id
db.orders.find({userId:user_id})
/*
* {
*   "_id" : ObjectId("6013c836cb67494036ad2a9f"),
*   "list" : ["西瓜", "桃子", "橘子"],
*   "userId" : ObjectId("6013c7e0cb67494036ad2a9d")
* }
*/

多对多(Many to Many)

  • 老师 – 学生、分类 – 商品
/*老师、学生*/
db.teachers.insert([
	{name:"Jack"},
	{name:"Mike"},
	{name:"bluce"}
]);
db.teachers.find();
 
db.studs.insert([
	{name:"郭靖",
	teacherIds:[
			ObjectId("5b4dc529090e87579f7c472c"),
			ObjectId("5b4dc529090e87579f7c472d")
		]
	},
	{name:"灰太狼",
	teacherIds:[
			ObjectId("5b4dc529090e87579f7c472c"),
			ObjectId("5b4dc529090e87579f7c472d"),
			ObjectId("5b4dc529090e87579f7c472e")
		]
	}
]);
db.studs.find();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值