MongoDB 非关系型数据库 -文档数据库(二)语法太多记不住?关系型语句 vs Mongo语句
关系型数据库 vs MongoDB 语法对应清单
一、数据库级别操作
|
操作类型 |
关系型数据库 (MySQL/PostgreSQL) |
MongoDB |
|
查看所有数据库 |
SHOW DATABASES; |
show dbs 或 show databases |
|
创建数据库 |
CREATE DATABASE db_name; |
use db_name(隐式创建) |
|
切换数据库 |
USE db_name; |
use db_name |
|
查看当前数据库 |
SELECT DATABASE(); |
db.getName() 或 db |
|
删除数据库 |
DROP DATABASE db_name; |
db.dropDatabase() |
|
查看数据库大小 |
SELECT table_schema, SUM(data_length+index_length) FROM information_schema.tables GROUP BY table_schema; |
db.stats() |
|
查看数据库版本 |
SELECT VERSION(); |
db.version() |
二、集合/表级别操作
|
操作类型 |
关系型数据库 |
MongoDB |
|
查看所有表/集合 |
SHOW TABLES; |
show collections 或 show tables |
|
创建表/集合 |
CREATE TABLE users (id INT, name VARCHAR(100)); |
db.createCollection("users") |
|
隐式创建 |
- |
db.users.insertOne({})(插入时自动创建) |
|
查看表结构 |
DESCRIBE users; 或 SHOW COLUMNS FROM users; |
typeof db.users.findOne()(查看示例文档) |
|
修改表结构 |
ALTER TABLE users ADD COLUMN age INT; |
无固定结构,直接插入带新字段的文档即可 |
|
删除表/集合 |
DROP TABLE users; |
db.users.drop() |
|
查看表信息 |
SHOW TABLE STATUS LIKE 'users'; |
db.users.stats() |
|
重命名表/集合 |
RENAME TABLE users TO new_users; |
db.users.renameCollection("new_users") |
三、创建操作 (CREATE)
|
操作类型 |
关系型数据库 |
MongoDB |
|
插入单条记录 |
INSERT INTO users (name, age) VALUES ('张三', 25); |
db.users.insertOne({name: "张三", age: 25}) |
|
插入多条记录 |
INSERT INTO users (name, age) VALUES ('李四', 30), ('王五', 28); |
db.users.insertMany([{name: "李四", age: 30}, {name: "王五", age: 28}]) |
|
插入并返回ID |
INSERT INTO users ...; SELECT LAST_INSERT_ID(); |
db.users.insertOne(...)(返回插入的_id) |
|
忽略重复插入 |
INSERT IGNORE INTO users ... |
db.users.insertMany([...], {ordered: false})(批量插入时) |
|
替换插入 |
REPLACE INTO users ... |
db.users.replaceOne({_id: id}, newDoc, {upsert: true}) |
四、查询操作 (READ)
4.1 基础查询
|
操作类型 |
关系型数据库 |
MongoDB |
|
查询所有 |
SELECT * FROM users; |
db.users.find({}) |
|
查询指定字段 |
SELECT name, age FROM users; |
db.users.find({}, {name: 1, age: 1, _id: 0}) |
|
条件查询 |
SELECT * FROM users WHERE age = 25; |
db.users.find({age: 25}) |
|
去重查询 |
SELECT DISTINCT city FROM users; |
db.users.distinct("city") |
|
限制数量 |
SELECT * FROM users LIMIT 5; |
db.users.find({}).limit(5) |
|
跳过记录 |
SELECT * FROM users LIMIT 5 OFFSET 10; |
db.users.find({}).skip(10).limit(5) |
|
排序 |
SELECT * FROM users ORDER BY age DESC, name ASC; |
db.users.find({}).sort({age: -1, name: 1}) |
4.2 条件查询
|
操作类型 |
关系型数据库 |
MongoDB |
|
AND 条件 |
SELECT * FROM users WHERE age > 25 AND city = '北京'; |
db.users.find({age: {$gt: 25}, city: "北京"}) |
|
OR 条件 |
SELECT * FROM users WHERE age > 30 OR city = '上海'; |
db.users.find({$or: [{age: {$gt: 30}}, {city: "上海"}]}) |
|
组合条件 |
SELECT * FROM users WHERE (age > 25 AND city = '北京') OR name LIKE '张%'; |
db.users.find({$or: [{$and: [{age: {$gt: 25}}, {city: "北京"}]}, {name: /^张/}]}) |
|
NOT 条件 |
SELECT * FROM users WHERE NOT age = 25; |
db.users.find({age: {$ne: 25}}) |
|
IN 条件 |
SELECT * FROM users WHERE age IN (25, 30, 35); |
db.users.find({age: {$in: [25, 30, 35]}}) |
|
NOT IN |
SELECT * FROM users WHERE age NOT IN (25, 30); |
db.users.find({age: {$nin: [25, 30]}}) |
4.3 比较操作符
|
操作 |
关系型数据库 |
MongoDB |
|
等于 |
WHERE age = 25 |
{age: 25} |
|
不等于 |
WHERE age != 25 |
{age: {$ne: 25}} |
|
大于 |
WHERE age > 25 |
{age: {$gt: 25}} |
|
大于等于 |
WHERE age >= 25 |
{age: {$gte: 25}} |
|
小于 |
WHERE age < 25 |
{age: {$lt: 25}} |
|
小于等于 |
WHERE age <= 25 |
{age: {$lte: 25}} |
|
介于之间 |
WHERE age BETWEEN 20 AND 30 |
{age: {$gte: 20, $lte: 30}} |
|
为空 |
WHERE email IS NULL |
{email: null} 或 {email: {$exists: false}} |
|
不为空 |
WHERE email IS NOT NULL |
{email: {$exists: true, $ne: null}} |
4.4 模糊查询
|
操作类型 |
关系型数据库 |
MongoDB |
|
包含 |
WHERE name LIKE '%张%' |
{name: /张/} |
|
开头匹配 |
WHERE name LIKE '张%' |
{name: /^张/} |
|
结尾匹配 |
WHERE name LIKE '%张' |
{name: /张$/} |
|
不区分大小写 |
WHERE name LIKE '%zhang%'(取决于排序规则) |
{name: /zhang/i} |
|
正则表达式 |
WHERE name REGEXP '^张.*三$' |
{name: {$regex: '^张.*三$'}} |
4.5 聚合查询
|
操作类型 |
关系型数据库 |
MongoDB |
|
计数 |
SELECT COUNT(*) FROM users WHERE age > 25; |
db.users.count({age: {$gt: 25}}) 或 db.users.find({age: {$gt: 25}}).count() |
|
求和 |
SELECT SUM(amount) FROM orders; |
db.orders.aggregate([{$group: {_id: null, total: {$sum: "$amount"}}}]) |
|
平均值 |
SELECT AVG(age) FROM users; |
db.users.aggregate([{$group: {_id: null, avgAge: {$avg: "$age"}}}]) |
|
最大值 |
SELECT MAX(age) FROM users; |
db.users.aggregate([{$group: {_id: null, maxAge: {$max: "$age"}}}]) |
|
最小值 |
SELECT MIN(age) FROM users; |
db.users.aggregate([{$group: {_id: null, minAge: {$min: "$age"}}}]) |
|
分组 |
SELECT city, COUNT(*) FROM users GROUP BY city; |
db.users.aggregate([{$group: {_id: "$city", count: {$sum: 1}}}]) |
|
分组并过滤 |
SELECT city, COUNT(*) FROM users GROUP BY city HAVING COUNT(*) > 10; |
db.users.aggregate([{$group: {_id: "$city", count: {$sum: 1}}}, {$match: {count: {$gt: 10}}}]) |
五、更新操作 (UPDATE)
|
操作类型 |
关系型数据库 |
MongoDB |
|
更新单条记录 |
UPDATE users SET age = 26 WHERE id = 1; |
db.users.updateOne({_id: ObjectId("...")}, {$set: {age: 26}}) |
|
更新多条记录 |
UPDATE users SET status = 'active' WHERE age > 25; |
db.users.updateMany({age: {$gt: 25}}, {$set: {status: "active"}}) |
|
替换文档 |
UPDATE users SET name = '张三', age = 26 WHERE id = 1; |
db.users.replaceOne({_id: id}, {name: "张三", age: 26}) |
|
字段自增 |
UPDATE users SET age = age + 1 WHERE id = 1; |
db.users.updateOne({_id: id}, {$inc: {age: 1}}) |
|
字段自减 |
UPDATE users SET age = age - 1 WHERE id = 1; |
db.users.updateOne({_id: id}, {$inc: {age: -1}}) |
|
乘法更新 |
UPDATE users SET age = age * 2 WHERE id = 1; |
db.users.updateOne({_id: id}, {$mul: {age: 2}}) |
|
添加字段 |
ALTER TABLE users ADD COLUMN email VARCHAR(100); UPDATE users SET email = 'test@test.com' WHERE id = 1; |
db.users.updateOne({_id: id}, {$set: {email: "test@test.com"}}) |
|
删除字段 |
ALTER TABLE users DROP COLUMN email; |
db.users.updateOne({_id: id}, {$unset: {email: ""}}) |
|
重命名字段 |
ALTER TABLE users CHANGE old_name new_name VARCHAR(100); |
db.users.updateMany({}, {$rename: {"old_name": "new_name"}}) |
|
存在则更新,不存在则插入 |
INSERT INTO users (id, name) VALUES (1, '张三') ON DUPLICATE KEY UPDATE name = '张三'; |
db.users.updateOne({_id: id}, {$set: {name: "张三"}}, {upsert: true}) |
六、删除操作 (DELETE)
|
操作类型 |
关系型数据库 |
MongoDB |
|
删除单条记录 |
DELETE FROM users WHERE id = 1 LIMIT 1; |
db.users.deleteOne({_id: ObjectId("...")}) |
|
删除多条记录 |
DELETE FROM users WHERE age < 18; |
db.users.deleteMany({age: {$lt: 18}}) |
|
删除所有记录 |
DELETE FROM users; |
db.users.deleteMany({}) |
|
删除并返回 |
DELETE FROM users WHERE id = 1 RETURNING *;(PostgreSQL) |
db.users.findOneAndDelete({_id: id}) |
|
清空表 |
TRUNCATE TABLE users; |
db.users.deleteMany({}) 或 db.users.drop() |
七、数组操作
|
操作类型 |
关系型数据库 |
MongoDB |
|
数组添加元素 |
需要关联表 |
db.users.updateOne({_id: id}, {$push: {tags: "new"}}) |
|
数组添加多个元素 |
需要关联表 |
db.users.updateOne({_id: id}, {$push: {tags: {$each: ["a", "b", "c"]}}}) |
|
数组添加不重复元素 |
需要关联表 |
db.users.updateOne({_id: id}, {$addToSet: {tags: "new"}}) |
|
删除数组元素 |
需要关联表 |
db.users.updateOne({_id: id}, {$pull: {tags: "old"}}) |
|
删除多个数组元素 |
需要关联表 |
db.users.updateOne({_id: id}, {$pullAll: {tags: ["a", "b"]}}) |
|
弹出数组元素 |
需要关联表 |
db.users.updateOne({_id: id}, {$pop: {tags: 1}})(最后一个) |
|
按位置更新数组 |
需要关联表 |
db.users.updateOne({_id: id}, {$set: {"tags.0": "new"}}) |
|
查询包含某元素的数组 |
SELECT * FROM users WHERE id IN (SELECT user_id FROM user_tags WHERE tag = 'tag1'); |
db.users.find({tags: "tag1"}) |
|
查询数组长度 |
需要关联表计数 |
db.users.find({$where: "this.tags.length > 3"}) |
八、索引操作
|
操作类型 |
关系型数据库 |
MongoDB |
|
创建普通索引 |
CREATE INDEX idx_name ON users(name); |
db.users.createIndex({name: 1}) |
|
创建唯一索引 |
CREATE UNIQUE INDEX idx_email ON users(email); |
db.users.createIndex({email: 1}, {unique: true}) |
|
创建复合索引 |
CREATE INDEX idx_name_age ON users(name, age); |
db.users.createIndex({name: 1, age: -1}) |
|
创建全文索引 |
CREATE FULLTEXT INDEX idx_content ON articles(content); |
db.articles.createIndex({content: "text"}) |
|
查看索引 |
SHOW INDEX FROM users; |
db.users.getIndexes() |
|
删除索引 |
DROP INDEX idx_name ON users; |
db.users.dropIndex("idx_name") |
|
删除所有索引 |
- |
db.users.dropIndexes() |
九、关联查询
|
操作类型 |
关系型数据库 |
MongoDB |
|
内连接 |
SELECT * FROM orders JOIN users ON orders.user_id = users.id; |
db.orders.aggregate([{$lookup: {from: "users", localField: "user_id", foreignField: "_id", as: "user"}}]) |
|
左连接 |
SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id; |
db.users.aggregate([{$lookup: {from: "orders", localField: "_id", foreignField: "user_id", as: "orders"}}]) |
|
子查询 |
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100); |
db.users.find({_id: {$in: db.orders.distinct("user_id", {amount: {$gt: 100}})}}) |
十、事务操作
|
操作类型 |
关系型数据库 |
MongoDB |
|
开始事务 |
START TRANSACTION; |
session.startTransaction() |
|
提交事务 |
COMMIT; |
session.commitTransaction() |
|
回滚事务 |
ROLLBACK; |
session.abortTransaction() |
|
设置隔离级别 |
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; |
需要配置事务选项 |
十一、导入导出
|
操作类型 |
关系型数据库 |
MongoDB |
|
导出数据 |
mysqldump -u user -p dbname > backup.sql |
mongoexport --db dbname --collection users --out users.json |
|
导入数据 |
mysql -u user -p dbname < backup.sql |
mongoimport --db dbname --collection users --file users.json |
|
导出二进制 |
mysqldump --tab=/path |
mongodump --db dbname --out /path |
|
导入二进制 |
mysqlimport ... |
mongorestore --db dbname /path |
十二、性能分析
|
操作类型 |
关系型数据库 |
MongoDB |
|
分析查询 |
EXPLAIN SELECT * FROM users WHERE age > 25; |
db.users.find({age: {$gt: 25}}).explain("executionStats") |
|
查看慢查询 |
SET GLOBAL slow_query_log = ON; |
db.setProfilingLevel(1, 100)(记录超过100ms的查询) |
|
查看配置文件 |
SHOW VARIABLES LIKE 'slow_query_log%'; |
db.getProfilingStatus() |
这个对应清单涵盖了主要的CRUD操作和数据库管理功能,可以帮助开发人员在关系型数据库和MongoDB之间进行思维转换和代码迁移。
更多推荐




所有评论(0)