前面介绍了MongoDB的基本概念与常见的操作,本文来重点分析下MongoDB的增删改查操作
什么是“mongo”
它是一个命令行工具,用于连接一个特定的mongod实例。当我们没有带参数运行mongo命令,它将使用默认的端口号和localhost连接。本文对MongoDB增删改查操作都是使用mongo客户端来进行操作的。后续会介绍mongodb的可视化客户端mongodb-compass,这个工具就类似mysql中的navicat工具。
新增操作
插入数据
MongoDB 使用 insert() 或 save() 方法向集合中插入文档:如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
insert() 或 save() 方法都可以向collection里插入数据,两者区别:
- 如果不指定 _id 字段,save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
- 使用save函数,如果原来的对象不存在,那他们都可以向collection里插入数据,如果已经存在,save会调用update更新里面的记录,而insert则会忽略操作。
- insert可以一次性插入一个列表,而不用遍历,效率高, save则需要遍历列表,一个个插入。
基本的使用格式
db.col_name.insert(document)
db.col_name.save(document)
插入一个文档到 col 集合中:
db.col.insert({
title: 'MongoDB教程',
description: 'MongoDB是一个Nosql数据库',
by: 'admin',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
也可以将文档数据定义为一个变量,如下所示:
document = ({
title: 'MongoDB教程',
description: 'MongoDB是一个Nosql数据库',
by: 'admin',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
db.col_2.insert(document)
删除操作
remove() 函数是用来删除集合中的数据。在执行 remove() 函数前先执行 find() 命令来判断执行的条件是否正确,这是一个比较好的习惯。
db.col_name.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档。
- writeConcern :(可选)抛出异常的级别。
删除集合中所有文档
db.col.remove({})
删除集合中符合过滤条件的数据,删除likes中包含e的文档对象
> db.col.remove({likes:/e/})
移除 col 集合中 title 为 MongoDB教程 的文档,只删除第一条找到的记录
> db.col.remove({'title':'MongoDB教程'}, 1)
WriteResult({ "nRemoved" : 1 })
按照索引的顺序来删除数据,比如删除col集合中的第一个文档对象
> db.col.remove({},1)
WriteResult({ "nRemoved" : 1 })
更新操作
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。
update() 方法用于更新已存在的文档
db.col_name.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
- query : update 的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在 update 的记录,是否插入记录,true 为插入,默认是 false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
通过 update() 方法来更新 col 集合中的 title
$set 操作符为部分更新操作符,只更新 $set 之后的数据,而不是覆盖之前的数据。
db.col.update({ 'title': 'MongoDB教程' }, { $set: { 'title': 'MongoDB' } })
以上语句只会修改第一条发现的文档,如果要修改多条相同的文档,则需要设置 multi 参数为 true。
db.col.update({ 'title': 'MongoDB教程' }, { $set: { 'title': 'MongoDB' } }, { multi: true })
save() 方法通过传入的文档来替换已有文档。语法格式如下:
db.col_name.save(
<document>,
{
writeConcern: <document>
}
)
以下实例中我们替换了 col的文档数据:
document = ({
# 是根据ID去相同去进行更新操作
"_id" : ObjectId("61a6e084e9589b7c41110da4"),
title: 'MongoDB教程',
description: 'MongoDB是一个Nosql数据库',
by: 'admin',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 'hello world'
})
> db.col.save(document)
查询操作
查询操作是数据库操作中,功能最丰富的操作。下面重点说下MongoDB中各种常见的查询操作。
先往col集合中查询三份文档数据信息,只是其中的likes字段有点不同。
MongoDB通过collection对象的find()方法来查询文档,语法如下。find()相当于mysql中的select。
db.collection.find(query, projection)
# query:查询条件,类似于SQL中的WHERE部分
# projection:可选,使用投影操作符指定返回的键
find() 方法,它返回集合中所有文档
> db.col.find()
{ "_id" : ObjectId("61a6da36e9589b7c41110da3"), "title" : "MongoDB", "description" : "MongoDB是一个Nosql数据库", "by" : "admin", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : "hello" }
{ "_id" : ObjectId("61a6e084e9589b7c41110da4"), "title" : "MongoDB教程", "description" : "MongoDB是一个Nosql数据库", "by" : "admin", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : "hello world" }
{ "_id" : ObjectId("61a6e4a1e9589b7c41110da5"), "title" : "MongoDB教程", "description" : "MongoDB是一个Nosql数据库", "by" : "admin", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : "world" }
>
格式化输出:
> db.col.find().pretty()
{
"_id" : ObjectId("61a6da36e9589b7c41110da3"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "hello"
}
{
"_id" : ObjectId("61a6e084e9589b7c41110da4"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "hello world"
}
{
"_id" : ObjectId("61a6e4a1e9589b7c41110da5"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world"
}
>
findOne() 方法,它只返回一个文档。
> db.col.findOne()
{
"_id" : ObjectId("61a6da36e9589b7c41110da3"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "hello"
}
>
读取指定记录的条数
> db.col.find().pretty().limit(2)
{
"_id" : ObjectId("61a6da36e9589b7c41110da3"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "hello"
}
{
"_id" : ObjectId("61a6e084e9589b7c41110da4"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "hello world"
}
>
跳过指定数量的数据
> db.col.find().pretty().skip(1)
{
"_id" : ObjectId("61a6e084e9589b7c41110da4"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "hello world"
}
{
"_id" : ObjectId("61a6e4a1e9589b7c41110da5"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world"
}
>
排序:sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
> db.col.find().pretty().sort({'_id':1})
{
"_id" : ObjectId("61a6da36e9589b7c41110da3"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "hello"
}
{
"_id" : ObjectId("61a6e084e9589b7c41110da4"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "hello world"
}
{
"_id" : ObjectId("61a6e4a1e9589b7c41110da5"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world"
}
>
> db.col.find().pretty().sort({'_id':-1})
{
"_id" : ObjectId("61a6e4a1e9589b7c41110da5"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world"
}
{
"_id" : ObjectId("61a6e084e9589b7c41110da4"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "hello world"
}
{
"_id" : ObjectId("61a6da36e9589b7c41110da3"),
"title" : "MongoDB",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "hello"
}
>
sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
Where语句
如果你想获取"col"集合中 “data” 大于100,小于 200 的数据,你可以使用以下命令:
db.col.find({data : {$lt :200, $gt : 100}})
// 类似于SQL语句:
Select * from col where data>100 AND data<200;
测试实例
> db.col.find({data : {$lt :200, $gt : 100}}).pretty()
{
"_id" : ObjectId("61a71907e9589b7c41110da7"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 150
}
>
>
> db.col.find().pretty()
{
"_id" : ObjectId("61a71059e9589b7c41110da6"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 100
}
{
"_id" : ObjectId("61a71907e9589b7c41110da7"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 150
}
{
"_id" : ObjectId("61a7192ce9589b7c41110da8"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 200
}
>
>
> db.col.find({data : {$lt :200, $gt : 100}}).pretty()
{
"_id" : ObjectId("61a71907e9589b7c41110da7"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 150
}
>
条件操作符
条件操作符 | 中文 | 全英文 |
---|---|---|
$gt | 大于 | greater than |
$gte | 大于等于 | greater than equal |
$lt | 小于 | less than |
$lte | 小于等于 | less than equal |
$ne | 不等于 | not equal |
$type操作符
用来检索集合中匹配的数据类型
获取 “col” 集合中 data 为 String 的数据,获取 “col” 集合中 data 为 整型(数字默认保存为double类型) 的数据,你可以使用以下命令:
> db.col.find().pretty()
{
"_id" : ObjectId("61a71907e9589b7c41110da7"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 150
}
{
"_id" : ObjectId("61a7192ce9589b7c41110da8"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 200
}
{
"_id" : ObjectId("61a71df7e9589b7c41110da9"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : 400
}
{
"_id" : ObjectId("61a72071e9589b7c41110daa"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : "800"
}
>
>
> db.col.find({"data" : {$type : 1}}).pretty()
{
"_id" : ObjectId("61a71907e9589b7c41110da7"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 150
}
{
"_id" : ObjectId("61a7192ce9589b7c41110da8"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 200
}
{
"_id" : ObjectId("61a71df7e9589b7c41110da9"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : 400
}
>
>
> db.col.find({"data" : {$type : 2}}).pretty()
{
"_id" : ObjectId("61a72071e9589b7c41110daa"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : "800"
}
>
AND条件
find() 方法可以传入多个键(key),每个键(key)以逗号隔开,语法格式如下:
db.col_name.find({key1:value1, key2:value2}).pretty()
// 类似于 SQL and 语句:
SELECT * FROM col_name WHERE key1='value1' AND key2=value2
查询出col集合中by为admin并且data为800的文档对象
> db.col.find().pretty()
{
"_id" : ObjectId("61a71907e9589b7c41110da7"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 150
}
{
"_id" : ObjectId("61a7192ce9589b7c41110da8"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 200
}
{
"_id" : ObjectId("61a71df7e9589b7c41110da9"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : 400
}
{
"_id" : ObjectId("61a72071e9589b7c41110daa"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : "800"
}
>
>
> db.col.find({"by":"admin","data":"800"}).pretty()
{
"_id" : ObjectId("61a72071e9589b7c41110daa"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : "800"
}
>
OR条件
or条件用例测试
> db.col.find().pretty()
{
"_id" : ObjectId("61a7192ce9589b7c41110da8"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 200
}
{
"_id" : ObjectId("61a71df7e9589b7c41110da9"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : 400
}
{
"_id" : ObjectId("61a72071e9589b7c41110daa"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : "800"
}
>
>
> db.col.find({ $or: [{ "likes": "world" }, { "data": 400 }] }).pretty()
{
"_id" : ObjectId("61a7192ce9589b7c41110da8"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 200
}
{
"_id" : ObjectId("61a71df7e9589b7c41110da9"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : 400
}
>
AND和OR联合使用
AND 和 OR 联合使用测试用例
> db.col.find().pretty()
{ ()
"_id" : ObjectId("61a7192ce9589b7c41110da8"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : "world",
"data" : 200
}
{
"_id" : ObjectId("61a71df7e9589b7c41110da9"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : 400
}
{
"_id" : ObjectId("61a72071e9589b7c41110daa"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : "800"
}
>
>
>
> db.col.find({"data": {$gt: 300},$or: [{"by": "admin" }, {"title": "MongoDB教程"}]}).pretty()
{
"_id" : ObjectId("61a71df7e9589b7c41110da9"),
"title" : "MongoDB教程",
"description" : "MongoDB是一个Nosql数据库",
"by" : "admin",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"data" : 400
}
>
// 类似常规 SQL 语句:
SELECT * FROM col where data>300 AND (by = 'admin' OR title = 'MongoDB教程')
本文小结
本文详细介绍了MongoDB中的增删改查操作,查询操作内容相关的概念与知识过多,后续会继续介绍。