Article

MongoDB(一)初识MongoDB

MongoDB(一)初识MongoDB

作者:lomtom

个人网站:lomtom.cn 🔗

个人公众号:博思奥园 🔗

你的支持就是我最大的动力。

MongoDB 系列:

  1. MongoDB(一)初识 MongoDB
  2. MongoDB(二)在 Go 中使用 MongoDB 原来这么简单
  3. MongoDB(三)数据模型

NoSQL

NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是 SQL”。一般 NoSQL 指的是非关系型数据库。

NoSQL 按存储方式可分为:

  1. 列存储(Hbase、Cassandra、Hypertable)
  2. 文档存储(MongoDB、CouchDB)

NoSQL 如今也是应用的非常广泛,至于为什么,离不开 NoSQL 区别于关系型数据库的优点(请自行百度)。

MongoDB

MongoDB 🔗是一个基于分布式文件存储的数据库,本质上是一个文档类型的数据库。

Mongo 优点

  1. 丰富的查询语言
  2. 高性能、高可用
  3. 容易拓展

在使用 MongoDB 之前,需要了解几个概念:

  1. 文档

    MongoDB 中的一条记录就是一个文档,它是一种由字段和值对组成的数据结构。

  1. 集合

    MongoDB 将文档存放在集合中,相当于关系型数据库中的一张表。(对于不存在的集合进行操作时,MongoDB 会隐性的创建一个集合)

  2. BSON

    MongoDB 将数据记录存储为BSON 🔗(JSON 的二进制格式)文档。

  3. MongoDB 使用限制 🔗

CURD

MongoDB 中的所有写操作在单个文档级别上都是原子的 。

插入操作

MongoDB 为插入提供多种方法,包括:

  1. db.collection.insertOne() 3.2 版本新功能
  2. db.collection.insertMany() 3.2 版本新功能
  3. db.collection.insert() 已弃用

例如往demo集合中插入单条数据:

db.demo.insertOne({"name":"lomtom"});

插入成功后,会返回

{
  "acknowledged": true,
  "insertedId": "61b04d2f3a549526de76ded3"
}

这里需要注意的几点是:

  1. 如果执行插入操作时,指定的集合(例如 demo)不存在,则会创建该集合。
  2. 如果文档没有指定_id 字段,那么 MongoDB 将在插入之前添加该_id字段并ObjectId()为文档分配一个唯一 的。即为返回的 insertedId 数据。最终的数据为 {"_id" : ObjectId("61b04d2f3a549526de76ded3"),"name":"lomtom"}

如果需要插入多条数据时:

db.demo.insertMany([{"name":"lomtom1"},{"name":"lomtom2"}]);

使用批量插入需要注意的是:

  1. 默认情况下,文档是按顺序插入的。如果需要无序插入(可能会提高插入的性能),需要将ordered设置为 false。
  2. 对于单次写入多个文档的时候,其中的文档发生错误时,并不妨碍其余文档的写入操作。

当然,我们也可以使用其他方法来达成写入的操作:

更新操作

MongoDB 提供了多种更新操作的函数:

  1. db.collection.updateOne() 3.2 版本新功能
  2. db.collection.updateMany() 3.2 版本新功能
  3. db.collection.replaceOne() 3.2 版本新功能
  4. db.collection.update() 已弃用

updateOne使用:更新单个文档

db.demo.updateOne({"name":"lomtom"},{$set:{"name":"lomtom1"}})

其中,第一个参数为过滤条件,第二个为更新操作(即将 name 为 lomtom 的文档改为 lomtom1)。

返回结果:

// 1
{
  "acknowledged": true,
  "matchedCount": 1,
  "modifiedCount": 1
}

注:如果有多条结果满足条件时,会更新第一条满足条件的文档

在插入操作中有提到使用 updateOne()与 upsert: true 选项一起可达到插入的操作:

db.demo.updateOne({"name":"lomtom55"},{$set:{"name":"lomtom"}},{upsert:true})

当 upsert 参数为 true 时,会有两种结果:

  1. 如果集合中有满足文档筛选条件的,则执行更新操作,
  2. 否则,则执行插入操作。

updateMany使用:更新多个文档

db.demo.updateMany({"name":"lomtom"},{$set:{"name":"lomtom1"}},{upsert:true})

该条语句的作用是将文档中所有 name 为 lomtom,修改为 lomtom1。

同样也可以与upsert:true来达到插入效果。

replaceOne使用:更新单个文档

db.demo.replaceOne({"name":"lomtom"},{"name":"lomtom1"})

replaceOne 与 updateOne、updateMany 不同的是 replaceOne 替换操作(第二个参数)不能使用 更新运算符 🔗,而后两种必须使用。

其他可达到更新的操作:

查询操作

MongoDB 的查询操作是使用find方法来进行查询,方法内可传递参数作为过滤器进行筛选。

  1. 传递空参数则查询所有数据。
db.demo.find();

db.demo.find({});
  1. 筛选某个字段(查询 name 为 lomtom 的所有文档)
db.demo.find({"name":"lomtom"});
  1. 使用查询运算符 🔗

    例如:in 查询 (查询 name 包含 lomtom、lomtom1 的文档)

db.demo.find({"name":{$in :["lomtom","lomtom1"]}});
  1. 模糊查询
db.demo.find({"name":/lomtom/});
  1. 限制返回的文档数量
db.demo.find({}).limit(2);
  1. 按某个字段进行排序(按照_id 降序排序,字段的值为 1/-1,分别代表升序/降序)
db.demo.find({}).sort({_id:-1});
  1. 设置文档的起始位置(跳过第一条数据)
db.demo.find().skip(1)

删除操作

与插入、更新一样,MongoDb 为删除以提供多种操作

  1. db.collection.deleteOne()
  2. db.collection.deleteMany()
  3. db.collection.remove() 已弃用

deleteOne使用:删除单个文件

db.demo.deleteOne({"name":"lomtom1"})

执行后返回以下结果:

// 1
{
  "acknowledged": true,
  "deletedCount": 1
}

deleteMany使用:删除多个文件

其他可达到删除的操作:

Copyright

本文为原创内容,欢迎分享与引用,请保留作者与原文链接。

文章标题

MongoDB(一)初识MongoDB

作者

lomtom

发布方式

原创发布

原文链接 https://lomtom.cn/c1ee46a9