进入MongoDB中文手册(4.2版本)目录
除了下面的图表,有关MongoDB的常见问题您可以参考“ 常见问题”。
1 术语和概念
下表介绍了各种SQL术语和概念以及相应的MongoDB术语和概念。
SQL术语/概念 | MongoDB术语/概念 |
---|---|
数据库 | 数据库 |
表 | 集合 |
行 | 文档 or BSON 文档 |
列 | 字段(field) |
索引 | 索引 |
表连接 | $lookup, 嵌入文档 |
主键 指定任何唯一的列或列组合作为主键。 | 主键 在MongoDB中,主键自动设置为 _id字段。 |
聚合(例如group by) | 聚合管道 请参见SQL到聚合的映射表。 |
SELECT INTO NEW_TABLE | $out 请参见SQL到聚合的映射表。 |
MERGE INTO TABLE | $merge (MongoDB 4.2开始可用) 请参见SQL到聚合的映射表。 |
事务 | 事务 提示: 在许多情况下,非规范化数据模型(嵌入式文档和数组) 将继续是您数据和用例的最佳选择,而不是多文档事务。也就是说,在许多情况下,对数据进行适当的建模将最大程度地减少对多文档事务的需求。 |
2 可执行文件
下表显示了一些数据库可执行文件和相应的MongoDB可执行文件。该表并非详尽无遗。
\ | MongoDB | MySQL | Oracle | Informix | DB2 |
---|---|---|---|---|---|
数据库服务端 | mongod | mysqld | oracle | IDS | DB2 Server |
数据库客户端 | mongo | mysql | sqlplus | DB-Access | DB2 Client |
3 示例
下表显示了各种SQL语句和相应的MongoDB语句。表格中的示例假定以下条件:
- SQL示例假定一个名为people的表。
- MongoDB示例假定一个名为people的集合,其中包含以下原型的文档:
{
_id: ObjectId("509a8fb2f3f4948bd2f983a0"),
user_id: "abc123",
age: 55,
status: 'A'
}
3.1 创建和更改
下表列出了与表级操作有关的各种SQL语句以及相应的MongoDB语句。
SQL语句 | MongoDB语句 |
---|---|
CREATE TABLE people ( id MEDIUMINT NOT NULL AUTO_INCREMENT, user_id Varchar(30), age Number, status char(1), PRIMARY KEY (id) ) | 在第一次使用insertOne() or insertMany()操作时隐式的创建集合,如果未指定_id字段,则自动添加主键_id。 db.people.insertOne( { user_id: “abc123”, age: 55, status: “A” } ) 也可以显示的创建集合: db.createCollection(“people”) |
ALTER TABLE people ADD join_date DATETIME | 集合不描述也不强制固定文档结构,也就是说,在集合级别上没有结构的改变。但是,在文档级别,updateMany() 操作可以使用$set运算符将字段添加到现有文档中 。 db.people.updateMany( { }, { $set: { join_date: new Date() } } ) |
ALTER TABLE people DROP COLUMN join_date | 集合不描述也不强制固定文档结构,也就是说,在集合级别上没有结构的改变。但是,在文档级别,updateMany() 操作可以使用$unset运算符删除现有文档中的字段。 db.people.updateMany( { }, { $unset: { “join_date”: “” } } ) |
CREATE INDEX idx_user_id_asc ON people(user_id) | db.people.createIndex( { user_id: 1 } ) |
CREATE INDEX idx_user_id_asc_age_desc ON people(user_id, age DESC) | db.people.createIndex( { user_id: 1, age: -1 } ) |
DROP TABLE people | db.people.drop() |
有关方法和运算符的更多信息,请参见:
- db.collection.insertOne();
- db.collection.insertMany();
- db.createCollection();
- db.collection.updateMany();
- db.collection.createIndex();
- db.collection.drop();
- $set;
- $unset。
也可以看看:
- 数据库和集合;
- 文档;
- 索引;
- 数据建模概念。
3.2 插入
下表显示了与将记录插入表有关的各种SQL语句和相应的MongoDB语句。
SQL插入语句 | MongoDB insertOne() 语句 |
---|---|
INSERT INTO people(user_id, age, status) VALUES (“bcd001”, 45, “A”) | db.people.insertOne( { user_id: “bcd001”, age: 45, status: “A” } ) |
有关更多信息,请参见db.collection.insertOne()。
也可以看看:
- 插入文档;
- db.collection.insertMany();
- 数据库和集合;
- 文档。
3.3 查询
下表显示了与从表中读取记录相关的各种SQL语句和相应的MongoDB语句。
注意
除非通过投影明确排除,否则该find()方法始终将_id字段包含在返回的文档中 。即使某些字段不包含在相应find()的查询中,下面的某些SQL查询也可能包含一个_id字段。
SQL SELECT 语句 | MongoDB find() 语句 |
---|---|
SELECT * FROM people | db.people.find() |
SELECT id, user_id, status FROM people | db.people.find( { }, { user_id: 1, status: 1 } ) |
SELECT user_id, status FROM people | db.people.find( { }, { user_id: 1, status: 1, _id: 0 } ) |
SELECT * FROM people WHERE status = “A” | db.people.find( { status: “A” } ) |
SELECT user_id, status FROM people WHERE status = “A” | db.people.find( { status: “A” }, {user_id: 1, status: 1, _id: 0 } ) |
SELECT * FROM people WHERE status != “A” | db.people.find( { status: { $ne: “A” } } ) |
SELECT * FROM people WHERE status = "A" AND age = 50 | db.people.find( { status: “A”,age: 50 } ) |
SELECT * FROM people WHERE status = "A" OR age = 50 | db.people.find( { $or: [ { status: “A” } , { age: 50 } ] } ) |
SELECT * FROM people WHERE age > 25 | db.people.find( { age: { $gt: 25 } } ) |
SELECT * FROM people WHERE age < 25 | db.people.find( { age: { $lt: 25 } } ) |
SELECT * FROM people WHERE age > 25 AND age <= 50 | db.people.find( { age: { $gt: 25, $lte: 50 } } ) |
SELECT * FROM people WHERE user_id like “%bc%” | db.people.find( { user_id: /bc/ } ) -or- db.people.find( { user_id: { $regex: /bc/ } } ) |
SELECT * FROM people WHERE user_id like “bc%” | db.people.find( { user_id: /^bc/ } ) -or- db.people.find( { user_id: { $regex: /^bc/ } } ) |
SELECT * FROM people WHERE status = "A" ORDER BY user_id ASC | db.people.find( { status: “A” } ).sort( { user_id: 1 } ) |
SELECT * FROM people WHERE status = "A" ORDER BY user_id DESC | db.people.find( { status: “A” } ).sort( { user_id: -1 } ) |
SELECT COUNT(*) FROM people | db.people.count() or db.people.find().count() |
SELECT COUNT(user_id) FROM people | db.people.count( { user_id: { $exists: true } } ) or db.people.find( { user_id: { $exists: true } } ).count() |
SELECT COUNT(*) FROM people WHERE age > 30 | db.people.count( { age: { $gt: 30 } } ) or db.people.find( { age: { $gt: 30 } } ).count() |
SELECT DISTINCT(status) FROM people | db.people.aggregate( [ { $group : { _id : “$status” } } ] ) or db.people.distinct( “status” ) distinct结果集不超过BSON的限制 |
SELECT * FROM people LIMIT 1 | db.people.findOne() or db.people.find().limit(1) |
SELECT * FROM people LIMIT 5 SKIP 10 | db.people.find().limit(5).skip(10) |
EXPLAIN SELECT * FROM people WHERE status = “A” | db.people.find( { status: “A” } ).explain() |
有关的方法和运算符的更多信息,请参见:
- db.collection.find();
- db.collection.distinct();
- db.collection.findOne();
- limit();
- skip();
- explain();
- sort();
- count();
- $ne;
- $and;
- $or;
- $gt;
- $lt;
- $exists;
- $lte;
- $regex。
也可以看看: - 查询文档;
- 查询和投影运算符;
- mongo Shell方法。
3.4 修改
下表显示了修改表中的现有记录有关的各种SQL语句以及相应的MongoDB语句。
SQL修改语句 | MongoDB updateMany()语句 |
---|---|
UPDATE people SET status = "C" WHERE age > 25 | db.people.updateMany( { age: { $gt: 25 } }, { $set: { status: “C” } } ) |
UPDATE people SET age = age + 3 WHERE status = “A” | db.people.updateMany( { status: “A” } , { $inc: { age: 3 } } ) |
有关示例中的方法和运算符的更多信息,请参见:
- db.collection.updateMany();
- $gt;
- $set;
- $inc
也可以看看: - 修改文档;
- 修改运算符;
- db.collection.updateOne();
- db.collection.replaceOne()。
3.5 删除
下表显示了从表中删除记录有关的各种SQL语句和相应的MongoDB语句。
SQL删除语句 | MongoDB deleteMany() 语句 |
---|---|
DELETE FROM people WHERE status = “D” | db.people.deleteMany( { status: “D” } ) |
DELETE FROM people | db.people.deleteMany({}) |
有关更多信息,请参见db.collection.deleteMany()。
也可以看看
- 删除文档;
- db.collection.deleteOne()。
4 进一步阅读
如果您正在考虑将SQL应用程序迁移到MongoDB,请下载《MongoDB应用程序现代化指南》(MongoDB Application Modernization Guide)
下载内容包括以下资源:
- 演示使用MongoDB进行数据建模的方法;
- 白皮书涵盖了从RDBMS数据模型迁移到MongoDB的最佳实践和注意事项;
- 参考和RDBMS等效的MongoDB模式;
- 应用程序现代化记分卡。