MongoDB(一)初识MongoDB

578 阅读3分钟

作者:lomtom

个人网站:lomtom.cn

个人公众号:博思奥园

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

NoSQL

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

NoSQL按存储方式可分为:

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

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

MongoDB

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

Mongo优点

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

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

  1. 文档

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

crud-annotated-document.bakedsvg.svg

  1. 集合

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

crud-annotated-collection.bakedsvg.svg

  1. BSON

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

  2. 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使用:删除多个文件

其他可达到删除的操作: