【MongoDB系列】MongoDB初体验

2022/04/19 数据库 共 3626 字,约 11 分钟

今天我们来学习下MongoDB数据库,首先了解下MongoDB是什么。

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

MongoDB可以为WEB应用提供可扩展的高性能数据存储解决方案,其主要特点如下:

  • 面向集合存储,易存储对象类型的数据。
  • 模式自由
  • 支持动态查询
  • 可通过网络访问
  • 支持查询
  • 支持复制和故障恢复
  • 支持完全索引,包含内部对象
  • 文件存储格式为BSON(一种JSON的扩展)
  • 自动处理碎片,以支持云计算层次的扩展性
  • 使用高效的二进制数据存储,包括大型对象(如视频等)

看起来挺牛X的,那么问题来了,MongoDB可以取代mysql么,还是两种数据库结合使用,他们有啥区别呢。

MongoDB系列计划分为多篇,包括从零入门、Springboot集成MongoDB、高级特性等。

本文是MongoDB系列第一篇,重点介绍安装使用以及常用的命令语法。

首先介绍下安装MongoDB。

安装

MongoDB有Community和Enterprise两个版本,我们下载免费的Community版本即可。

官网下载页面,根据自己的系统选择安装对应的版本。

我这里是macOS版本,使用Homebrew安装

brew tap mongodb/brew
brew update
brew install mongodb-community@5.0

安装完成后,启动服务

brew services start mongodb-community@5.0

查看版本

mongod -version

版本结果如下:

db version v5.0.7
Build Info: {
    "version": "5.0.7",
    "gitVersion": "b977129dc70eed766cbee7e412d901ee213acbda",
    "modules": [],
    "allocator": "system",
    "environment": {
        "distarch": "x86_64",
        "target_arch": "x86_64"
    }
}

下面我们介绍MongoDB常用的Shell命令。

连接数据库

连接本地数据库,默认端口27017,未设置密码,默认directConnection=true。

mongosh "mongodb://localhost:27017"
Current Mongosh Log ID:	6260f8b212cbac8b5e45a789
Connecting to:		mongodb://localhost:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.3.1
Using MongoDB:		5.0.7
Using Mongosh:		1.3.1

创建数据库

登录后,当前默认的库名 是test

我们可以使用 use 创建数据库。如果数据库不存在,则创建数据库,否则切换到指定数据库。

use DATABASE_NAME

示例如下:

test> use demo
switched to db demo
demo> 

CRUD

MongoDB的操作语句和mysql的差别还是挺大的,个人感觉MongoDB偏向面向对象的思想,对后台开发者更友好。

插入文档

插入文档有单个插入和批量插入。

语法:

db.myCollection.insertOne() 
db.myCollection.insertMany() 

示例1:

db.user.insertOne({name: 'luoxiang', 
    							 age: 2,
    							 tags: ['teacher', 'smart']
})

// 返回信息
{
  acknowledged: true,
  insertedIds: { '0': ObjectId("626121d412cbac8b5e45a78a") }
}

示例2:

db.user.insertMany([
									{	name: 'nanshan', 
    							 	age: 80,
    							 	tags: ['doctor', 'good']
    							},
    							{	name: 'zhangfei', 
    							 	age: 55,
    							 	tags: ['soldier', 'strong']
    							}       
])

查询文档

查询所有,类似SQL select * from user

db.user.find()

指定eq条件查询,: ,类似SQL `select * from user where name = 'zhangsan'`

db.user.find( { "name": "zhangsan" } )

其他条件查询,{ : { : }, ... },类似SQL `select * from user where name in ['yindongxu', 'zhangsan']`

// in条件查询
db.user.find( { name: { $in: [ "yindongxu", "zhangsan" ] } } )

AND查询

db.user.find( { name: "zhangsan", "age": { $gte: 7 } } )

更新文档

更新文档有3种方式:

db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()

示例1:更新单个

db.user.updateOne( { name: "zhangsan" },
{
  $set: {
    tags: "hello world"
  }
})

示例2:更新多个


db.user.updateMany(
  { age: { $lt: 50 } },
  {
    $set: { tags: "age less than 50" }
  }
)

示例3:替换文档

替换除了id外的其他字段,替换文档可以具有与原始文档不同的字段。

db.user.replaceOne(
  { name: "nanshan" },
  { name: "zhongnanshan", title: "教授", desc: [ "医生", "老师" ] }
)

最终数据库的数据如下:

image-20220421231825541

删除文档

删除文档包括删除单个文档、删除多个文档

db.collection.deleteMany()
db.collection.deleteOne()

删除单个文档示例:

db.user.deleteOne( { name: "zhangfei" } )

删除多个文档示例:

db.user.deleteMany( { tags: "age less than 50" } )

常用操作符

条件操作符

  • (>) 大于 - $gt
  • (<) 小于 - $lt
  • (>=) 大于等于 - $gte
  • (<= ) 小于等于 - $lte

$type 操作符

$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。

如果想获取 “user” 集合中 name 为 String 的数据,你可以使用以下命令:

db.user.find({"name" : {$type : 'string'}})
或
db.user.find({"name" : {$type : 2}}) // 2代表String类型,具体对应关系请自行查询

结果如下:

image-20220422094253226

排序

在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

db.COLLECTION_NAME.find().sort({KEY:1})

示例:

db.user.find().sort({age:1})

聚合

MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。语法如下:

db.<collection>.aggregate([
  {
    <$stage1>
  },
  {
    <$stage2>
  }
  ...
])

示例:

db.user.aggregate([{$group : {_id : "$name", num_tutorial : {$sum : 1}}}])

类似SQL select name, count(*) from user group by name

这里只给了一个简单的示例,聚合还包括管道,这里就不展开了。

总结

SQL和MongoDB的比较如下:

SQL术语MongoDB术语说明
databasedatabase数据库
tablecollectionSQL表对应MongoDB集合
rowdocumentSQL记录行对应MongoDB文档
columnfieldSQL表字段对应MongoDB域
indexindex索引
table joins 表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

MongoDB的语法对后台开发者还是挺友好的,极易上手,数据结构灵活,容易扩展,至于性能如何,请看下文分解。

文档信息

搜索

    Table of Contents