SQL到MongoDB的映射图表 在本页面

    除了下面的图表之外,您可能需要考虑有关MongoDB的常见问题的常见问题部分。

    术语和概念

    下表介绍了各种SQL术语和概念以及相应的MongoDB术语和概念。

    SQL术语/概念 MongoDB术语/概念
    database database
    table collection
    row document or BSON document
    column field
    index index
    table joins $lookup, 嵌入文档
    primary key
    (指定任何唯一的列或列组合作为主键。)
    primary key
    (在MongoDB中,主键自动设置为_id字段。)
    aggregation (e.g. group by) aggregation pipeline
    See the SQL to Aggregation Mapping Chart.
    SELECT INTO NEW_TABLE $out
    See the SQL to Aggregation Mapping Chart.
    MERGE INTO TABLE $merge (Available starting in MongoDB 4.2)
    See the SQL to Aggregation Mapping Chart.
    Transactions transactions
    在许多情况下,非规范化数据模型(嵌入式文档和数组)
    将继续是您数据和用例的最佳选择,而不是多文档事务。
    也就是说,在许多情况下,对数据进行适当的建模将最
    大程度地减少对多文档交易的需求。

    可执行文件

    下表展示了一些数据库可执行文件和相应的MongoDB可执行文件。这个表格并不是详尽无遗的。

    MongoDB MySQL Oracle Informix DB2
    Database Server mongod mysqld oracle IDS DB2 Server
    Database Client mongo mysql sqlplus DB-Access DB2 Client

    例子

    下表展示了各种SQL语句和相应的MongoDB语句。表中的例子假设以下条件:

    • SQL示例假设有一个名为people的表。
    • MongoDB示例假设一个名为people的集合,它包含以下原型的文档:
    1. {
    2. _id: ObjectId("509a8fb2f3f4948bd2f983a0"),
    3. user_id: "abc123",
    4. age: 55,
    5. status: 'A'
    6. }

    创建和修改

    下表展示了与表级操作相关的各种SQL语句以及相应的MongoDB语句。

    SQL Schema语句 MongoDB Schema语句
    CREATE TABLE people (
    id MEDIUMINT NOT NULL
    AUTO_INCREMENT,
    user_id Varchar(30),
    age Number,
    status char(1),
    PRIMARY KEY (id)
    )
    隐式创建的第一个insertOne()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.updateMany() $set
    db.collection.insertMany() db.collection.createIndex() $unset
    db.createCollection() db.collection.drop()

    另看:

    下表显示了与将记录插入表和相应的MongoDB语句有关的各种SQL语句。

    SQL INSERT语句 MongoDB insertOne() Statements
    INSERT INTO people(user_id,
    age,
    status)
    VALUES (“bcd001”,
    45,
    “A”)
    db.people.insertOne(
    { user_id: “bcd001”, age: 45, status: “A” }
    )

    有关更多信息,请参见db.collection.insertOne()

    也可以看看:

    下表展示了与从表中读取记录相关的各种SQL语句以及相应的MongoDB语句。

    注意

    除非通过投影明确排除,否则[find()方法始终在返回的文档中包含_id字段。 下面的某些SQL查询可能包含一个_id字段来反映这一点,即使该字段未包含在相应的find()查询中也是如此。

    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( { userid: /bc/ } )
    _or

    db.people.find( { user_id: { $regex: /bc/ } } )
    SELECT
    FROM people
    WHERE user_id *like
    “bc%”
    db.people.find( { userid: /^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( { userid: { $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, for distinct value sets that do not exceed the BSON size limit
    db.people.distinct( “status” )
    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() .$ne
    .db.collection.distinct() .$and
    .db.collection.findOne() .$or
    .limit() .$gt
    .skip() .$lt
    .explain() .$exists
    .sort() .$lte
    .count() .$regex

    另看:

    下表显示了与更新表中的现有记录和相应的MongoDB语句有关的各种SQL语句。

    SQL Update Statements MongoDB updateMany() Statements
    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 } }
    )

    有关示例中使用的方法和运算符的更多信息,请参见:

    另看:

    下表显示了与从表中删除记录和相应的MongoDB语句有关的各种SQL语句。

    SQL Delete Statements MongoDB deleteMany() Statements
    DELETE FROM people
    WHERE status = “D”
    db.people.deleteMany( { status: “D” } )
    DELETE FROM people db.people.deleteMany({})

    获得更多信息,请参见:db.collection.deleteMany().

    另看:

    如果您正在考虑将SQL应用程序迁移到MongoDB,请下载《 MongoDB应用程序现代化指南》

    下载内容包括以下资源:

    • 演示使用MongoDB进行数据建模的方法
    • 白皮书涵盖了从RDBMS数据模型迁移到MongoDB的最佳实践和注意事项
    • 参考MongoDB模式及其等效RDBMS
    • 应用程序现代化记分卡

    译者:杨帅

    校对:杨帅

    参见

    原文 - SQL to MongoDB Mapping Chart