前面介绍了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中的增删改查操作,查询操作内容相关的概念与知识过多,后续会继续介绍。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐