MongoDB的基础操作

348 阅读5分钟

1 数据库\集合操作

1.1 创建数据库

语法use DATABASE_NAME
说明:切换到指定的数据库,若数据库不存在,则创建以该名称命名的数据库
实例:创建一个名为socialmedia的数据库

use socialmedia

需要注意,此时由于该数据库为空,因此不会显示在数据库列表中。

1.2 创建集合

语法db.createCollection(name, options)
说明

  • name: 所创建的集合名称
  • options: 指定有关内存大小,暂时了解即可 实例:在socialmedia的数据库中创建名为douyin和bilibili的集合
db.createCollection("douyin")
db.createCollection("bilibili")

此时再输入show collections,可以查看该数据库中所有的集合;输入show dbs也可以顺利地在数据库列表中查看到新建的数据库。

1.3 删除集合

语法db.collection.drop()
实例:将socialmedia的数据库中的bilibili集合删除

db.bilibili.drop()

此时再输入show collections,可以看到集合bilibili已被删除

1.4 删除数据库

语法db.dropDatabase()
实例:删除socialmedia数据库

use socialmedia
db.dropDatabase()

此时再输入show dbs,可以看到数据库socialmedia已被删除

2 文档的增删改

2.1 插入文档

语法

  1. insertOne()方法,插入一个文档
db.collection.insertOne(
    < document > ,
    {
        writeConcern: < document > 
    }
)
  1. insertMany()方法,插入多个文档
db.collection.insertMany(
    [ < document1 > , < document2 > , ...],
    {
        writeConcern: < document > ,
        ordered: < boolean > 
    }
)
  1. insert()方法,是前两者方法的结合,但推荐用前两种方法,因为具有较好的可读性~ 说明
    如果插入文档到一个不存在的集合,MongoDB则会自动创建和命名该集合,再插入文档。
  • document:所插入的文档
  • writeConcern:写入策略,暂时了解即可
  • ordered:指定是否按顺序写入 实例:在socialmedia库的douyin集合插入多个文档
db.douyin.insertMany(
    [
        {
            "aweme_id": 115615646865,
            "aweme_name": "蜜雪冰城甜蜜蜜",
            "likes": 555,
            "follower": 3
        },
        {
            "aweme_id": 11561564565,
            "aweme_name": "105度的热爱",
            "likes": 5545,
            "follower": 24
        },
        {
            "aweme_id": 115615325565,
            "aweme_name": "三句话让男人为我花18w",
            "likes": 5545,
            "follower": 45
        },
        {
            "aweme_id": 11561534265,
            "aweme_name": "套马杆",
            "likes": 666,
            "follower": 45
        }
    ]
)

此时再输入db.douyin.find(),可以查看到该集合中的所有文档。

2.2 更新文档

语法

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

说明

  • query: update的查询条件
  • update: update对象的更新操作
  • upsert: 若不存在update的对象,是否插入新数据,默认为不插入
  • multi: 是否更新找到的所有符合条件的记录,默认仅更新找到的第一条数据
  • writeConcern :抛出异常的级别 实例:将刚才插入的4条数据中所有"follower"=45的文档中的"aweme_id"改为88888888
db.douyin.update(
    {"follower": 45},
    {$set: {"aweme_id": 88888888}},
    {multi: true}
)

此时再输入db.douyin.find(),可以看到数据已经更新,如果不写{multi:true},那么MongoDB就只会更新找到的第一条数据,需要注意~

2.3 删除文档

语法

  1. deleteOne()方法,只删除一个符合条件的文档
db.collection.deleteOne(
    < filter > ,
    {
        writeConcern: < document > ,
        collation: < document > 
    }
)
  1. deleteMany()方法,删除所有符合条件的文档
db.collection.deleteMany(
    < filter > ,
    {
        writeConcern: < document > ,
        collation: < document > 
    }
)
  1. remove()方法,实质上是前两者方法的结合,多出一个justOne参数来控制只删除一个或者全删,但推荐使用前两种方法以提升代码的可读性~ 说明
  • filter: 过滤文档的条件
  • writeConcern: 抛出异常的级别
  • collation: 指定用于操作的collation 实例:删除douyin集合中"aweme_id"=8888888的所有文档
db.douyin.deleteMany({
    "aweme_id": 88888888
})

此时再输入db.douyin.find(),可以看到符合条件的文档已被删除

3 文档查询

3.1 find()方法

语法db.collection.find(query, projection)
说明

  • query:使用查询操作符指定查询条件,若不指定查询条件则用{}代替
  • projection:指定返回的键,该参数有两种模式:
  1. 在inclusion模式中,输入格式例如{title: 1},用1来表示要返回的字段,不需要返回的字段不用写;
  2. 在exclusion模式中,输入格式例如{title: 0},用0来表示不需要返回的字段,除此以外的字段都会返回;
  • 唯一主键_id默认返回,需要主动指定 _id: 0才会隐藏主键。

3.2 AND和OR条件

语法

  1. AND条件
db.collection.find({
    key1: value1,
    key2: value2
})
  1. OR条件
db.collection.find(
    {
        $or: [
            {key1: value1},
            {key2: value2}
        ]
    }
)

说明

  • AND条件仅需要传入多个键值对,用逗号隔开即可
  • OR条件则需要使用关键字$or,将键值对以数组的方式传入

3.3 条件操作符

条件操作符MongoDB语法SQL语法
等于(数值判断)/db.collection.find({key: value})where key = value
小于$ltdb.collection.find({key: {$lt: value}})where key < value
小于等于$ltedb.collection.find({key: {$lte: value}})where key <= value
大于$gtdb.collection.find({key: {$gt: value}})where key > value
大于等于$gtedb.collection.find({key: {$gte: value}})where key >= value
不等于$nedb.collection.find({key: {$ne: value}})where key != value

3.4 其他方法

3.4.1 limit()方法

语法db.collection.find().limit(number)
说明:在符合查询结果的文档中,显示number条文档。

3.4.2 skip()方法

语法db.collection.find().skip(number)
说明:在符合查询结果的文档中,先跳过number条文档后,再显示后续文档。

3.4.3 sort()方法

语法db.collection.find().sort({KEY:1})
说明:在符合查询结果的文档中,对指定字段进行排序,并使用1和-1来指定排序方式,其中1为升序排列,而 -1是降序排列。

3.5 举个栗子

  1. 向socialmedia数据库的bilibili集合中插入若干条文档
use socialmedia
db.bilibili.insertMany([
    {"aweme_id": 115615646865,"aweme_name": "蜜雪冰城甜蜜蜜","likes": 555,"follower": 3},
    {"aweme_id": 11561564565,"aweme_name": "105度的热爱","likes": 5545,"follower": 24},
    {"aweme_id": 115615325565,"aweme_name": "三句话让男人为我花18w","likes": 5545,"follower": 45},
    {"aweme_id": 11561534265,"aweme_name": "套马杆","likes": 666,"follower": 56},
    {"aweme_id": 115615352525,"aweme_name": "A","likes": 67,"follower": 35},
    {"aweme_id": 11561453434534,"aweme_name": "B","likes": 65646,"follower": 70},
    {"aweme_id": 117987978975,"aweme_name": "C","likes": 666,"follower": 80}
])
  1. 查询"likes"大于1000且小于10000或者"follower"不等于70和3,返回"likes"和"aweme_name"字段,不显示_id,查询结果按"likes"降序排列,跳过第1条文档且仅显示4条文档
db.bilibili.find(
    {$or: [
        {likes: {$gt: 1000, $lt: 10000}}, 
        {follower: {$ne: 70, $ne: 3}}
        ]
    }, 
    {likes: 1,aweme_name: 1,_id: 0}
).sort({likes: -1}).skip(1).limit(4)

4 聚合查询

4.1 aggregate()方法

  • MongoDB的聚合函数就是将文档输入处理管道,在管道内完成对文档的操作,最终将文档转换为聚合结果。
  • 自己的理解:aggregate()就像流水线上的一道道工序,大致的流程是从查询文档到计算数据。 语法db.collection.aggregate(AGGREGATE_OPERATION)
    说明
  • aggregate()方法需要结合管道操作符一起使用
  • 基本管道操作提供过滤器,其操作类似查询和文档转换,可以修改输出文档的形式
  • 其他管道操作提供了按特定字段对文档进行分组和排序的工具,以及用于聚合数组内容的工具
  • 此外,在管道阶段还可以使用运算符来执行诸如计算平均值或连接字符串之类的任务

4.2 常用的管道操作符

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理,管道操作可以搭配使用,使用多个管道操作符需要以数组的形式传入函数。聚合框架中常用的管道操作符如下:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档
  • $match:用于过滤数据,只输出符合条件的文档
  • $limit:用来限制MongoDB聚合管道返回的文档数
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
  • $group:将集合中的文档分组,可用于统计结果
  • $sort:将输入文档排序后输出

4.2.1 $project

$project的基本格式可以参考find()方法中的projection参数,但是可以利用运算符实现更多功能:

运算符功能说明
$add加法数值计算
$subtract减法数值计算
$multipy乘法数值计算
$divide除法数值计算
$mod求模数值计算
$concat连接字符串操作
$substr截取字符串操作

除此以外还有处理关系运算和逻辑运算的运算符,其实就是判断大小类型和与或非,特点是返回结果为布尔值。

实例:

  1. 在socialmeida库中的xiaohongshu集合中插入一些文档:
use socialmedia
db.xiaohongshu.insertMany([
    {"author": "aaa","aweme_name": "蜜雪冰城甜蜜蜜","likes": 555,"follower": 3},
    {"author": "bbb","aweme_name": "105度的热爱","likes": 5545,"follower": 24},
    {"author": "bbb","aweme_name": "三句话让男人为我花18w","likes": 5545,"follower": 45},
    {"author": "aaa","aweme_name": "套马杆","likes": 666,"follower": 56},
    {"author": "ccc","aweme_name": "哈哈哈","likes": 67,"follower": 35},
    {"author": "ccc","aweme_name": "啦啦啦","likes": 65646,"follower": 70},
    {"author": "bbb","aweme_name": "嘻嘻嘻","likes": 666,"follower": 80}
])
  1. 拼接"author"和"aweme_name"字段,格式为"author---aweme_name",并将该字段命名为"A1",将"likes"和"follower"相加,并将该字段命名为"A2":
db.xiaohongshu.aggregate({
    $project: {
        _id: 0,
        A1: {"$concat": ["$author", "---", "$aweme_name"]},
        A2: {"$add": ["$likes", "$follower"]}
    }
})

4.2.2 $group

$group类似于SQL中的group by,可以对数据进行分组聚合,常用运算符如下:

运算符功能
$sum计算总和
$avg计算平均值
$min计算最小值
$max计算最大值

实例
沿用上一节的数据,在socialmeida库中的xiaohongshu集合中计算每个author的作品数量和likes平均值

db.xiaohongshu.aggregate({
    $group: {
        _id: "$author",
        "作品数": {$sum: 1},
        "平均值": {$avg: "$likes"}
    }
})

代码中_id后是需要聚合的字段,该参数可以为null
代码中的{$sum: 1}和SQL中count(*)类似,可以对比着理解

4.2.3 $match

$match类似于find()方法中的query参数,仅用于过滤数据。
实例
沿用上一节的数据,在socialmeida库中的xiaohongshu集合中查询follower大于50的"aweme_name"。

db.xiaohongshu.aggregate([
    {$project: {_id: 0, aweme_name: 1, follower: 1}},
    {$match: {follower: {$gt: 50}}}
])

代码中利用$project来选择需要显示的字段,再用$match过滤数据,反过来也是可以的~