目录

  1. MongoDB 关系概述
  2. MongoDB 数据库引用
  3. MongoDB 数据嵌套
  4. MongoDB 参考资料

MongoDB 关系概述

在关系型数据库中,数据通过表格中的列和行的结构关联在一起。而在 MongoDB 这样的 NoSQL 数据库中,数据通常是以文档(JSON 或 BSON 格式)存储的。由于 MongoDB 是一个面向文档的数据库,它的“关系”模型与传统关系数据库有所不同。

MongoDB 中并没有类似于关系型数据库的外键或连接操作。取而代之的是,MongoDB 提供了两种主要的方式来实现“关系”或数据之间的连接:

  1. 数据嵌套(Embedding):将相关的数据嵌套在同一个文档中。
  2. 数据引用(Referencing):在不同的文档中存储数据的引用(类似于关系数据库中的外键)。

这两种方式可以单独使用,也可以组合使用,具体选择哪种方式取决于业务需求和数据访问模式。


MongoDB 数据库引用

数据库引用通常使用文档中的字段保存另一个文档的 _id 来表示两个文档之间的关系。与关系型数据库中的外键相似,引用关系允许文档之间的关联。

示例:引用关系

假设有两个集合:users(用户)和 orders(订单)。每个订单都与一个用户关联。

  1. 插入用户文档
<?php
$collection = $database->users;

$user = [
    '_id' => new MongoDB\BSON\ObjectId(),
    'name' => 'John Doe',
    'email' => 'johndoe@example.com'
];

$result = $collection->insertOne($user);
echo "Inserted user with ID: " . $result->getInsertedId() . "\n";
?>

  1. 插入订单文档,引用用户
<?php
$collection = $database->orders;

$order = [
    'order_id' => 'A123',
    'user_id' => $user['_id'],  // 引用用户的 _id
    'total' => 100.50,
    'status' => 'Pending'
];

$result = $collection->insertOne($order);
echo "Inserted order with ID: " . $result->getInsertedId() . "\n";
?>

通过在订单文档中存储用户的 _id,我们建立了 orders 集合和 users 集合之间的引用关系。为了查询某个用户的所有订单,可以通过查询订单集合中的 user_id 字段来实现。


MongoDB 数据嵌套

数据嵌套是指将相关的数据嵌入到同一个文档中,这样可以避免通过引用关系进行多次查询。数据嵌套特别适用于“关系紧密”的数据,或当数据不会频繁更新时。

示例:数据嵌套

假设我们将订单和订单项嵌套在同一个用户文档中,而不是在订单集合中进行引用。

  1. 插入带嵌套订单文档
<?php
$collection = $database->users;

$user = [
    '_id' => new MongoDB\BSON\ObjectId(),
    'name' => 'John Doe',
    'email' => 'johndoe@example.com',
    'orders' => [
        [
            'order_id' => 'A123',
            'total' => 100.50,
            'status' => 'Pending',
            'items' => [
                ['item_id' => 'P001', 'quantity' => 2, 'price' => 50.25],
                ['item_id' => 'P002', 'quantity' => 1, 'price' => 25.00]
            ]
        ]
    ]
];

$result = $collection->insertOne($user);
echo "Inserted user with ID: " . $result->getInsertedId() . "\n";
?>

在这个例子中,订单数据完全嵌套在用户文档中的 orders 字段下。这种方式避免了连接查询,也提升了读取效率,尤其是在数据关系简单并且不会频繁更新的情况下。


参考资料

如需更多帮助或信息,请访问 www.52kanjuqing.com