MongoDB(一)初识MongoDB
- December 8, 2021
作者:lomtom
个人网站:lomtom.cn 🔗
个人公众号:博思奥园 🔗
你的支持就是我最大的动力。
MongoDB系列:
NoSQL
NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是SQL”。一般NoSQL指的是非关系型数据库。
NoSQL按存储方式可分为:
- 列存储(Hbase、Cassandra、Hypertable)
- 文档存储(MongoDB、CouchDB)
- …
NoSQL如今也是应用的非常广泛,至于为什么,离不开NoSQL区别于关系型数据库的优点(请自行百度)。
MongoDB
MongoDB 🔗是一个基于分布式文件存储的数据库,本质上是一个文档类型的数据库。
Mongo优点
- 丰富的查询语言
- 高性能、高可用
- 容易拓展
- …
在使用MongoDB之前,需要了解几个概念:
-
文档
MongoDB 中的一条记录就是一个文档,它是一种由字段和值对组成的数据结构。
-
集合
MongoDB将文档存放在集合中,相当于关系型数据库中的一张表。(对于不存在的集合进行操作时,MongoDB会隐性的创建一个集合)
-
BSON
MongoDB将数据记录存储为BSON 🔗(JSON的二进制格式)文档。
CURD
MongoDB 中的所有写操作在单个文档级别上都是原子的 。
插入操作
MongoDB为插入提供多种方法,包括:
db.collection.insertOne()
3.2 版本新功能db.collection.insertMany()
3.2 版本新功能db.collection.insert()
已弃用
例如往demo
集合中插入单条数据:
db.demo.insertOne({"name":"lomtom"});
插入成功后,会返回
{
"acknowledged":true,
"insertedId":"61b04d2f3a549526de76ded3"
}
这里需要注意的几点是:
- 如果执行插入操作时,指定的集合(例如demo)不存在,则会创建该集合。
- 如果文档没有指定_id字段,那么 MongoDB 将在插入之前添加该
_id
字段并ObjectId()
为文档分配一个唯一 的。即为返回的 insertedId 数据。最终的数据为{"_id" : ObjectId("61b04d2f3a549526de76ded3"),"name":"lomtom"}
如果需要插入多条数据时:
db.demo.insertMany([{"name":"lomtom1"},{"name":"lomtom2"}]);
使用批量插入需要注意的是:
- 默认情况下,文档是按顺序插入的。如果需要无序插入(可能会提高插入的性能),需要将
ordered
设置为 false。- 对于单次写入多个文档的时候,其中的文档发生错误时,并不妨碍其余文档的写入操作。
当然,我们也可以使用其他方法来达成写入的操作:
db.collection.updateOne()
🔗与upsert: true
选项一起使用时。db.collection.updateMany()
🔗与upsert: true
选项一起使用时。db.collection.findAndModify()
🔗与upsert: true
选项一起使用时。db.collection.findOneAndUpdate()
🔗与upsert: true
选项一起使用时 。db.collection.findOneAndReplace()
🔗与upsert: true
选项一起使用时 。db.collection.bulkWrite()
🔗.
更新操作
MongoDB提供了多种更新操作的函数:
db.collection.updateOne()
3.2 版本新功能db.collection.updateMany()
3.2 版本新功能db.collection.replaceOne()
3.2 版本新功能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时,会有两种结果:
- 如果集合中有满足文档筛选条件的,则执行更新操作,
- 否则,则执行插入操作。
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替换操作(第二个参数)不能使用 更新运算符 🔗,而后两种必须使用。
其他可达到更新的操作:
db.collection.findOneAndReplace()
🔗.db.collection.findOneAndUpdate()
🔗.db.collection.findAndModify()
🔗.db.collection.bulkWrite()
🔗.
查询操作
MongoDB的查询操作是使用find
方法来进行查询,方法内可传递参数作为过滤器进行筛选。
- 传递空参数则查询所有数据。
db.demo.find();
或
db.demo.find({});
- 筛选某个字段(查询name为lomtom的所有文档)
db.demo.find({"name":"lomtom"});
-
使用查询运算符 🔗
例如:in 查询 (查询name包含lomtom、lomtom1的文档)
db.demo.find({"name":{$in :["lomtom","lomtom1"]}});
- 模糊查询
db.demo.find({"name":/lomtom/});
- 限制返回的文档数量
db.demo.find({}).limit(2);
- 按某个字段进行排序(按照_id降序排序,字段的值为1/-1,分别代表升序/降序)
db.demo.find({}).sort({_id:-1});
- 设置文档的起始位置(跳过第一条数据)
db.demo.find().skip(1)
删除操作
与插入、更新一样,MongoDb为删除以提供多种操作
db.collection.deleteOne()
db.collection.deleteMany()
db.collection.remove()
已弃用
deleteOne使用:删除单个文件
db.demo.deleteOne({"name":"lomtom1"})
执行后返回以下结果:
// 1
{
"acknowledged": true,
"deletedCount": 1
}
deleteMany使用:删除多个文件
其他可达到删除的操作:
-
db.collection.findOneAndDelete()
🔗.findOneAndDelete() 🔗 提供了一个排序选项。该选项允许删除按指定顺序排序的第一个文档。
-
db.collection.findAndModify()
🔗.db.collection.findAndModify()
🔗提供排序选项。该选项允许删除按指定顺序排序的第一个文档。