MongoDB入门

学习视频:尚硅谷MongoDB基础教程(数据库精讲)
真正的大师永远保持着一颗学徒的心

目录

MongoDB简介

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

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似jsonbson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

安装

官网下载:https://www.mongodb.com/try/download/community
Windows仓库下载地址:https://www.mongodb.org/dl/win32
Linux仓库下载地址:https://www.mongodb.org/dl/linux

安装步骤省略
我是使用树莓派安装,推荐文章:树莓派3B 使用 Docker 安装 MongoDB

三个概念

数据库(database)

MongoDB 中多个文档组成集合,多个集合组成数据库。一个MongoDB 实例可以承载多个数据库。

集合(collection)

集合就是一组文档,类似于关系数据库中的表。集合是无模式的,集合中的文档可以是各式各样的。

文档(document)

文档是 MongoDB 中数据的基本单位,类似于关系数据库中的行(但是比行复杂)

在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在,就会自动创建数据库或集合

MongoDB数据架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pMf3eO60-1594994647664)(4265335C9F2E4B1080A11107F4324979)]

基本指令

show dbs & show databases:显示全部的数据库
use <db>:进入到指定数据库中,如果不存在就创建
db:返回当前所在数据库名称
show collections:显示当前数据库中全部的集合

数据库CRUD操作

新增

MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:

db.<collection_name>.insert(document)

向名为collection_name的集合中插入一个文档

//向名为study的数据库中的名为user集合插入一条数据
use study
db.user.insert({username: 'Esion', password: '123456'})
//---结果---
//WriteResult({ "nInserted" : 1, "writeConcernError" : [ ] })

向名为collection_name的集合中插入多个文档

db.user.insert([
    {username: 'zbj',password: '1234'},
    {username: 'shs',password: '1234'}
])
//---结果---
// 1
BulkWriteResult({
	"nRemoved" : 0,
	"nInserted" : 2,
	"nUpserted" : 0,
	"nMatched" : 0,
	"nModified" : 0,
	"writeErrors" : [ ]
})

当我们向集合插入文档时,如果没有给文档指定_id属性,则数据库会自动为文档添加
该属性作为文档的唯一标识,主键
_id我们也可以自己指定,数据库就不会自动生成
如果我们自己指定,也要保持唯一性

db.<collection_name>.save(document)

//向名为study的数据库中的名为user集合插入一条数据
use study
db.user.save({username: 'Esion', password: '123456'})
//---结果---
//WriteResult({ "nInserted" : 1, "writeConcernError" : [ ] })

两者区别

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

在MongoDB3.2版本之后,插入一个是insertOne,插入多个事insertMany
查看更多:https://docs.mongodb.com/manual/tutorial/insert-documents/

查询

下方会会写上等价的SQL语句做对比

db.<collection_name>.find(document)

查询我们当前集合中的所有符合条件的文档

查询全部

db.user.find({})
//---结果---
// 1
{
    "_id": ObjectId("5f1129e3ea2f0000e9002003"),
    "username": "Esion",
    "password": "123456"
}
select * from user

按平等条件查询

db.user.find({ _id: ObjectId("5f112f45ea2f0000e9002005"), username: 'zbj'})
//---结果---
// 1
{
    "_id": ObjectId("5f112f45ea2f0000e9002005"),
    "username": "zbj",
    "password": "1234"
}
select * from user where id = ObjectId("5f112f45ea2f0000e9002005") and username = 'zbj'

使用查询运算符指定条件

db.user.find( { username: { $in: [ "swk", "shs" ] } } )
//---结果---
// 1
{
    "_id": ObjectId("5f112ea9ea2f0000e9002004"),
    "username": "swk",
    "password": "1234"
}

// 2
{
    "_id": ObjectId("5f11373bea2f0000e9002007"),
    "username": "shs",
    "password": "1234"
}

// 3
{
    "_id": ObjectId("5f113787ea2f0000e9002009"),
    "username": "shs",
    "password": "1234"
}
select * from user where username in ['swk', 'shs']

AND

db.user.save({_id: 'hello', username: 'Esion', password: '123456', age: 15})
db.user.save({_id: 'word', username: 'qmlc', password: '123456', age: 31})
db.user.find( { password: "123456", age: { $lt: 30 } } )
//---结果---
// 1
{
    "_id": "hello",
    "username": "Esion",
    "password": "123456",
    "age": 15
}

select * from user where password = 123456 and age < 30

OR

db.user.find( { $or: [ { username: "qmlc" }, { age: { $lt: 30 } } ] } )
//---结果---
// 1
{
    "_id": "hello",
    "username": "Esion",
    "password": "123456",
    "age": 15
}

// 2
{
    "_id": "word",
    "username": "qmlc",
    "password": "123456",
    "age": 131
}
select * from username where username = 'qmlc' or age < 30

AND 和 OR

db.user.find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )
SELECT * FROM user WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")

db.<collection_name>.findOne(document)

返回符合条件的第一个文档,用法与find一样
findOne返回的是一个对象,find返回的是一个数组
参考文档:https://docs.mongodb.com/manual/reference/method/db.collection.findOne/#db.collection.findOne

db.<collection_name>.find().count()

查询全部文档的数量

修改

  • db.collection.update(<query>, <update>, <options>)
  • db.collection.updateOne(<filter>, <update>, <options>)
  • db.collection.updateMany(<filter>, <update>, <options>)
  • db.collection.replaceOne(<filter>, <update>, <options>)

db.collection.update(<query>, <update>, <options>)

db.user.update({username: 'qmlc'}, {age: 32})
//---结果---
// 1
WriteResult({
	"nMatched" : 1,
	"nUpserted" : 0,
	"nModified" : 1,
	"writeConcernError" : [ ]
})
db.user.find()
//---结果---
{
    "_id": "word",
    "age": 32
}

注意:update默认情况下会使用新对象来替换就对象
如果只要修改指定的属性,而不是替换,需要使用“修改操作符”来完成修改

$set:设置,可以用来修改文档中的指定属性

db.user.find()
//---结果---
{
    "_id": "word",
    "username": "qmlc",
    "password": "123456",
    "age": 32
}
db.user.update({username: 'qmlc'}, {$set: {age: 31}})
//---结果---
WriteResult({
	"nMatched" : 1,
	"nUpserted" : 0,
	"nModified" : 1,
	"writeConcernError" : [ ]
})
db.user.find()
//---结果---
{
    "_id": "word",
    "username": "qmlc",
    "password": "123456",
    "age": 31
}

如果对象不存在则会新建,这个只会修改第一个符合条件的文档

$unset:可以删除文档的指定属性

db.collection.updateOne(<filter>, <update>, <options>)

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

db.collection.updateMany(<filter>, <update>, <options>)

修改全部符合条件的文档

删除

  • db.collection.deleteMany()
  • db.collection.deleteOne()
  • db.collection.remove(<filter>, <justOne>)

db.collection.remove()

删除符合条件的文档(默认全部)

db.user.remove({_id: 'hello'})
//---结果---
WriteResult({ "nRemoved" : 1, "writeConcernError" : [ ] })

如果删除一个的文档,第二个参数后面是true或1

db.user.remove({_id: 'hello'}, 1)

db.collection.deleteOne()

删除第一个符合条件的文档

db.collection.deleteOne()

删除全部符合条件的文档

如果只传递一个空对象作为参数,则会删除全部文档(性能略差,因为他会一个一个删除),所以可以直接集合db.user.drop(),但remove只是删除文档,但是不删除集合,集合还在

db.dropDatabase()

删除数据库
一般数据库中的数据都不会删除,所以删除的方法很少调用
一般在数据中添加一个字段来表示这个数据是否被删除

文档间的关系

一对一(one-to-one)

一个文档对应另一个文档
在MongoDB中,我们可以通过内嵌文档的形式来体现一对一的关系

一对多(one-to-many)

一个文档对应多个文档
也可以通过内嵌文档映射一对多的关系
在多的那个文档增加一个字段指向一个文档的_id,就可以实现一对多

多对多(many-to-many)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值