MongoDB的增删改查(CRUD操作)

作者: adm 分类: 教程 发布时间: 2023-08-16

本文全部内容以MongoDB4.2版本为基础。
文章目录
一、查询
二、插入
三、修改
四、删除
五、MongoDB Web Shell
参考
CRUD 操作即创建、读取、更新和删除文档,也就是我们常说的数据的增删改查。

一、查询
查询操作即从集合中检索文档。如下图为查询语句的解析。

以下为MongoDB查询语法,以及与关系型数据库语法的对比。

查询所有文档:

db.test.find( {} );   ⇒   SELECT * FROM test;

精确条件匹配:

db.test.find( { name: "xiaoming" } );  ⇒ SELECT * FROM test WHERE name = "xiaoming";

IN的用法:

db.test.find( { name: { $in: [ "xiaoming", "xiaohong" ] } } ) ;⇒ SELECT * FROM test WHERE name in ("xiaoming", "xiaohong");

AND的用法:

db.test.find( { name: "xiaohong", age: { $lt: 15 } } ); ⇒ SELECT * FROM test WHERE name = "A" AND age < 15;
#其中age使用了运算符小于的语法, mongo中大于、小于、大于等于、小于等于分别用$gt、$lt、$gte、$lte表示

OR的用法:

db.test.find( { $or: [ { name: "xiaoming" }, { age: { $lt: 15 } } ] } ); ⇒ SELECT * FROM test WHERE name = "xiaoming" OR age < 15;

AND+OR:

db.test.find( {
     name: "小明",
     $or: [ { qty: { $lt: 15 } }, { address: /^北京/ } ]
} );
#如上MongoDB语句转换为关系型数据库的SQL即为
SELECT * FROM test WHERE name = "xiaoming" AND ( age < 15 OR address LIKE "北京%");

#其中address处用的了MongoDB中的模糊匹配(即关系型数据库中的`like`),语法相比较如下:
#/^北京/  =  like '北京%'
#/北京/  =   like '%北京%'  

另外,MongoDB还提供了方法执行读取操作以返回单个文档:

db.collection.findOne()   即 =  db.collection.find().limit(1)

二、插入
MongoDB 中的所有写操作(增、删、改)在单个文档级别上都是原子的。
插入操作是将新文档添加到集合中。如果该集合当前不存在,则插入操作将创建该集合。
如下图为插入语句的解析。

在插入操作中,_id字段为MongoDB中每个集合必需的唯一索引,如果插入文档时没有指定_id字段,MongoDB 会将_id带有 ObjectId 值的字段添加到新文档中。

将单个文档插入集合中:

db.test.insertOne(
   { name: "xiaoming", age: 13, address: "北京市西城区" }
)

将多个文档插入到一个集合中:

db.test.insertMany([
   { name: "xiaoming", age: 13, address: "北京市西城区" },
   { name: "xiaohong", age: 14, address: "北京市东城区" },
   { name: "xiaogang", age: 15, address: "北京市朝阳区" }
])

另外,MongoDB提供了insert()方法既可以将单个文档也可以将多个文档插入到集合中,所以insert()是我们实际中更常用的方法:

db.test.insert([
   { name: "xiaoming", age: 13, address: "北京市西城区" },
   { name: "xiaohong", age: 14, address: "北京市东城区" },
   { name: "xiaogang", age: 15, address: "北京市朝阳区" }
])
#或
db.test.insert([
   { name: "xiaoming", age: 13, address: "北京市西城区" }
])

三、修改
更新操作即修改集合中的现有文档。如下图为修改语句的解析。

修改操作时,如果修改了原文档不存在的字段时,会自动插入。

仅修改与指定过滤器匹配的单个文档,即使匹配到多个文档:

#以下语句将姓名为xiaoming的第一条数据的年龄修改为20
db.test.updateOne(
   { name: "xiaoming" },
   {
     $set: { "age": 20 }  }
)

更新与指定过滤器匹配的所有文档:

#以下语句将所有年龄小于25的数据修改为年龄为15
db.test.updateMany(
   { "age": { $lt: 25 } },
   {
     $set: { age: 15 }
   }
)

文档替换(最多替换与指定过滤器匹配的单个文档,即使匹配到多个文档):

#以下语句将姓名为xiaoming的第一条数据修改为    { name: "xiaoming", sex: "男", phone:"13911111111" }
db.test.replaceOne(
   { name: "xiaoming" },
   { name: "xiaoming", sex: "男", phone:"13911111111" }
)

另外,MongoDB提供了update方法,既可以更新或者替换单个文档,也可以更新匹配的所有文档,包含了以上三个方法的所有功能,也是我们实际使用中更常用的方法:
即db.collection.update() , 语法与上述三个方法相同,仅需要将updateOne、updateMany、replaceOne 修改为 update即可,但要注意默认情况下,该方法仅更新单个文档,若要更新多个文档,需要使用multi选项。

#以下语句将所有年龄小于25的数据修改为年龄为15
db.test.update(
   { "age": { $lt: 25 } },
   {
     $set: { age: 15 }
   },
   {multi:true} 
)

四、删除
删除操作即从集合中删除匹配文档。如下图为删除语句的解析。

仅删除一个与指定过滤器匹配的文档,即使匹配到多个文档也只删除第一条:

db.inventory.deleteOne( { age: 13 } )

删除与指定过滤器匹配的所有文档:

db.inventory.deleteMany({ age : 13 })

删除集合中的所有文档:

db.inventory.deleteMany({})

remove()方法,可以删除与指定过滤器匹配的单个文档或所有文档:

remove()删除集合中的所有文档:

db.test.remove({})

remove和deleteOnede、leteMany 都用于删除文档记录。区别是remove返回结果为WriteResult,delete返回bson格式。

五、MongoDB Web Shell
MongoDB官网提供了在线练习工具,有需要的可以去试试。
复制到浏览器打开:https://www.mongodb.com/docs/v4.2/tutorial/query-documents/

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!