MongoDB的增删改查(CRUD操作)
本文全部内容以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/