用熟悉的MySQL思路来摸索MongoDB里的那些SQL样式语法吧
- 问答
- 2025-12-28 17:25:26
- 1
还记得咱们刚开始学MySQL的时候吗?天天跟SELECT、WHERE、INSERT这些语句打交道,后来听说有个叫MongoDB的数据库,很厉害,但一看是文档型的,感觉像是个新世界,有点无从下手,其实啊,MongoDB的设计者很贴心,知道咱们这群SQL老用户习惯难改,所以也提供了一套和SQL语法很像的操作方式,咱们今天就完全不用怕,就用熟悉的MySQL思路,来摸摸MongoDB的脾气。
第一站:数据库和表,变成了啥?
在MySQL里,咱们的数据库(Database)里面有很多表(Table),比如users表、orders表,在MongoDB里,这个概念几乎可以无缝切换,MongoDB里也有数据库(Database),但里面的“表”不叫表了,改名叫“集合”(Collection),你就把“集合”理解成“表”,一点问题都没有,MySQL里的users表,在MongoDB里就是users集合,选数据库还是用use your_database_name,感觉跟MySQL命令行里一模一样。
第二站:查数据,SELECT对应find
MySQL里查数据的核心是SELECT * FROM users,在MongoDB里,这个任务交给了db.users.find(),你看,db代表当前数据库,users是集合名,find()就是查找,执行一下db.users.find(),就相当于SELECT * FROM users,会把users集合里所有文档(也就是所有行数据)都给你翻出来。
那如果不想看所有字段呢?MySQL里是SELECT name, email FROM users,MongoDB里,就在find()里加个对象来指定,写成db.users.find({}, {name: 1, email: 1}),这里第一个空对象代表查询条件(先不管,后面说),第二个对象{name: 1, email: 1}里的1就表示“这个字段我要显示”,反过来,如果你想像SELECT那样,大部分字段都要,只想隐藏一两个,比如不想看password,在MySQL里可能有点麻烦,但在MongoDB里可以写成db.users.find({}, {password: 0}),这里的0就表示“这个字段我不要显示”,是不是挺直观的?
第三站:条件查询,WHERE对应find里的第一个对象

MySQL里筛选数据离不开WHERE,比如SELECT * FROM users WHERE age > 18,这个WHERE age > 18的部分,在MongoDB里就放到了find()的第一个参数里,怎么写呢?db.users.find({age: {$gt: 18}})。
这里可能一开始会有点不习惯。{age: {$gt: 18}}这个写法,意思是“age字段的值,要大于18”,这个$gt就是MongoDB里表示“大于”的操作符,相当于SQL里的>,类似的还有好多:
$eq:等于(等于的话其实可以直接写{age: 18})$lt:小于$gte:大于等于$lte:小于等于$in:在某个范围内,比如MySQL的WHERE age IN (18, 20, 25),对应MongoDB就是{age: {$in: [18, 20, 25]}}$and:和,用于多个条件$or:或
比如要找年龄大于18且城市是“北京”的用户,MySQL是WHERE age > 18 AND city='北京',MongoDB里就是db.users.find({$and: [{age: {$gt: 18}}, {city: "北京"}]}),因为and是默认的,所以很多时候你也可以简写成db.users.find({age: {$gt: 18}, city: "北京"})。
第四站:插数据,INSERT INTO对应insertOne或insertMany
MySQL里插入一行数据是INSERT INTO users (name, age) VALUES ('张三', 25),MongoDB里,因为数据是以类似JSON的文档形式存储的,所以插入操作就是直接把这个文档放进集合,插入一条用db.users.insertOne({name: "张三", age: 25}),你看,是不是很像?字段名和值直接写在花括号里就行了。

如果要插入多条,MySQL得写多个VALUES,MongoDB则用db.users.insertMany([{name: "李四", age: 30}, {name: "王五", age: 28}]),用一个数组把多个文档包起来。
第五站:改数据,UPDATE对应updateOne或updateMany
MySQL里更新是UPDATE users SET age = 26 WHERE name = '张三',MongoDB里,更新一条用updateOne,第一个参数是条件(就是WHERE),第二个参数是要做的更新操作。
这里有个关键点,更新操作要用$set这个操作符,所以上面那句SQL对应的MongoDB语句是db.users.updateOne({name: "张三"}, {$set: {age: 26}}),意思是:找到name是“张三”的文档,设置($set)它的age字段为26,如果不写$set,而直接写{age: 26},那可就不是更新某个字段了,它会用{age: 26}这个新文档整个替换掉原来的文档,其他字段就都没了!所以$set非常重要。
更新多条呢?就用updateMany,语法一样,只是会把所有符合条件的文档都更新。

第六站:删数据,DELETE对应deleteOne或deleteMany
这个最简单,MySQL里DELETE FROM users WHERE age < 18,MongoDB里,删一条符合条件的用db.users.deleteOne({age: {$lt: 18}}),删所有符合条件的用db.users.deleteMany({age: {$lt: 18}}),清空整个集合(相当于MySQL的TRUNCATE TABLE users)可以用db.users.deleteMany({}),花括号里空着就代表所有文档。
第七站:排序和分页,ORDER BY和LIMIT对应sort和limit
MySQL里,SELECT * FROM users ORDER BY age DESC是按年龄降序排,MongoDB里,查出来之后可以链式调用方法,写成db.users.find().sort({age: -1})。1表示升序,-1表示降序。
分页也一样,MySQL的LIMIT 10,对应MongoDB的.limit(10)。LIMIT 5, 10(从第5条开始,取10条)则对应.skip(5).limit(10),所以一个完整的查询可能长这样:db.users.find({city: "北京"}).sort({age: -1}).skip(10).limit(5),意思就是查找北京的用户,按年龄倒序排,跳过前10条,取接下来的5条,这跟SQL的思路是完全一致的。
总结一下
走这么一圈下来,你会发现,虽然MongoDB底层是文档模型,和MySQL的行列模型完全不同,但在最基本的增删改查操作上,它提供了一套和SQL语法思维非常接近的命令,咱们完全可以用已有的SQL知识作为地图,去探索MongoDB的世界,主要的转换关系就是:表变集合,行变文档,WHERE变find的第一个对象,SET变$set操作符,先把这几个核心对应关系搞明白,你就能在MongoDB里完成大部分你之前在MySQL里常做的操作了,上手速度会快非常多,剩下的,就是慢慢去体会文档模型带来的更灵活的数据结构优势了。
本文由符海莹于2025-12-28发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/70156.html
