news 2026/8/10 15:28:40

MongoDB(44)什么是引用?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MongoDB(44)什么是引用?

在MongoDB中,引用(Reference)是一种在文档之间建立关系的方式。与嵌入式文档不同,引用是通过存储其他集合中文档的标识符来建立关系。这种方式类似于SQL中的外键,适用于需要多个独立集合之间建立关系的场景。

引用的特点

  • 分离数据:引用将相关数据分离到不同的集合中,有助于减少数据冗余。
  • 独立更新:引用允许独立更新相关数据,而不需要更新整个文档。
  • 适合一对多和多对多关系:引用特别适用于复杂的数据模型,比如一对多和多对多关系。

使用引用的示例

以下示例展示了如何在MongoDB中使用引用。我们将使用Node.js和MongoDB的驱动进行操作。

安装MongoDB的Node.js驱动

npm install mongodb

插入包含引用的数据

const { MongoClient, ObjectId } = require('mongodb'); async function insertData() { const uri = "mongodb://localhost:27017"; const client = new MongoClient(uri, { useUnifiedTopology: true }); try { await client.connect(); const db = client.db('myDatabase'); const usersCollection = db.collection('users'); const ordersCollection = db.collection('orders'); await usersCollection.deleteMany({}); // 清空用户集合 await ordersCollection.deleteMany({}); // 清空订单集合 // 插入用户数据 const users = await usersCollection.insertMany([ { name: "Alice" }, { name: "Bob" }, { name: "Charlie" } ]); // 插入订单数据,并使用用户的ObjectId作为引用 await ordersCollection.insertMany([ { userId: users.insertedIds[0], amount: 50.5, date: new Date("2022-01-01") }, { userId: users.insertedIds[0], amount: 100.0, date: new Date("2022-02-01") }, { userId: users.insertedIds[1], amount: 75.0, date: new Date("2022-01-15") }, { userId: users.insertedIds[2], amount: 200.0, date: new Date("2022-03-01") } ]); console.log("Data inserted"); } finally { await client.close(); } } insertData().catch(console.error);

在上面的代码中,orders集合中的每个文档都包含一个userId字段,该字段引用了users集合中的用户文档的_id

查询包含引用的数据

async function queryData() { const uri = "mongodb://localhost:27017"; const client = new MongoClient(uri, { useUnifiedTopology: true }); try { await client.connect(); const db = client.db('myDatabase'); const usersCollection = db.collection('users'); const ordersCollection = db.collection('orders'); // 查询某个用户及其所有订单 console.log("\nQuery a user and their orders:"); let user = await usersCollection.findOne({ name: "Alice" }); let orders = await ordersCollection.find({ userId: user._id }).toArray(); console.log({ user, orders }); // 查询所有订单及其对应的用户信息 console.log("\nQuery all orders and their corresponding users:"); let results = await ordersCollection.aggregate([ { $lookup: { from: 'users', // 要关联的集合 localField: 'userId', // orders 集合中的字段 foreignField: '_id', // users 集合中的字段 as: 'user' // 输出数组字段 } }, { $unwind: '$user' // 展开数组 } ]).toArray(); console.log(results); } finally { await client.close(); } } queryData().catch(console.error);

在这个示例中,我们演示了如何查询包含引用的数据:

  1. 查询某个用户及其所有订单
  2. 查询所有订单及其对应的用户信息

运行这个脚本后,你会得到如下结果(示例输出):

// 查询某个用户及其所有订单 Query a user and their orders: { user: { _id: new ObjectId("..."), name: 'Alice' }, orders: [ { _id: new ObjectId("..."), userId: new ObjectId("..."), amount: 50.5, date: 2022-01-01T00:00:00.000Z }, { _id: new ObjectId("..."), userId: new ObjectId("..."), amount: 100, date: 2022-02-01T00:00:00.000Z } ] } // 查询所有订单及其对应的用户信息 Query all orders and their corresponding users: [ { _id: new ObjectId("..."), userId: new ObjectId("..."), amount: 50.5, date: 2022-01-01T00:00:00.000Z, user: { _id: new ObjectId("..."), name: 'Alice' } }, { _id: new ObjectId("..."), userId: new ObjectId("..."), amount: 100, date: 2022-02-01T00:00:00.000Z, user: { _id: new ObjectId("..."), name: 'Alice' } }, { _id: new ObjectId("..."), userId: new ObjectId("..."), amount: 75, date: 2022-01-15T00:00:00.000Z, user: { _id: new ObjectId("..."), name: 'Bob' } }, { _id: new ObjectId("..."), userId: new ObjectId("..."), amount: 200, date: 2022-03-01T00:00:00.000Z, user: { _id: new ObjectId("..."), name: 'Charlie' } } ]

其他语言示例

类似的操作可以在其他编程语言中实现,如Python。以下是Python的示例代码:

安装PyMongo

在终端中运行以下命令来安装PyMongo:

pip install pymongo

插入数据

from pymongo import MongoClient from datetime import datetime def insert_data(): client = MongoClient('mongodb://localhost:27017/') db = client['myDatabase'] users_collection = db['users'] orders_collection = db['orders'] users_collection.delete_many({}) # 清空用户集合 orders_collection.delete_many({}) # 清空订单集合 # 插入用户数据 users = users_collection.insert_many([ { "name": "Alice" }, { "name": "Bob" }, { "name": "Charlie" } ]) # 插入订单数据,并使用用户的ObjectId作为引用 orders_collection.insert_many([ { "userId": users.inserted_ids[0], "amount": 50.5, "date": datetime(2022, 1, 1) }, { "userId": users.inserted_ids[0], "amount": 100.0, "date": datetime(2022, 2, 1) }, { "userId": users.inserted_ids[1], "amount": 75.0, "date": datetime(2022, 1, 15) }, { "userId": users.inserted_ids[2], "amount": 200.0, "date": datetime(2022, 3, 1) } ]) print("Data inserted") insert_data()

查询数据

def query_data(): client = MongoClient('mongodb://localhost:27017/') db = client['myDatabase'] users_collection = db['users'] orders_collection = db['orders'] # 查询某个用户及其所有订单 print("\nQuery a user and their orders:") user = users_collection.find_one({ "name": "Alice" }) orders = list(orders_collection.find({ "userId": user['_id'] })) print({ "user": user, "orders": orders }) # 查询所有订单及其对应的用户信息 print("\nQuery all orders and their corresponding users:") pipeline = [ { '$lookup': { 'from': 'users', # 要关联的集合 'localField': 'userId', # orders 集合中的字段 'foreignField': '_id', # users 集合中的字段 'as': 'user' # 输出数组字段 } }, { '$unwind': '$user' # 展开数组 } ] results = list(orders_collection.aggregate(pipeline)) for result in results: print(result) query_data()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/10 15:26:42

Qwen3-VL-4B Pro企业落地:政府公文附图政策依据自动关联与条款引用

Qwen3-VL-4B Pro企业落地:政府公文附图政策依据自动关联与条款引用 1. 项目背景与需求场景 在日常政务工作中,政府机构需要处理大量包含附图的公文文件。这些附图可能是规划图纸、统计图表、现场照片或示意图,往往与具体的政策条款和法规依…

作者头像 李华
网站建设 2026/8/10 15:26:15

Qwen2.5-7B-Instruct实操手册:st.cache_resource加速响应+显存溢出容错方案

Qwen2.5-7B-Instruct实操手册:st.cache_resource加速响应显存溢出容错方案 想让你的本地大模型对话服务又快又稳吗?今天咱们就来聊聊如何用Qwen2.5-7B-Instruct这个“大家伙”,配合Streamlit打造一个既高效又不怕显存爆炸的智能对话系统。 …

作者头像 李华
网站建设 2026/8/10 15:27:38

ClawdBot语音处理:Whisper tiny本地转写准确率与延迟实测

ClawdBot语音处理:Whisper tiny本地转写准确率与延迟实测 1. 引言:为什么关注本地语音转写? 想象一下这个场景:你在Telegram群里收到一条外语语音消息,想快速知道内容,但又不想把音频上传到云端&#xff…

作者头像 李华
网站建设 2026/8/10 15:27:11

Jimeng LoRA多场景应用:游戏原画概念图/国风壁纸/头像生成全流程

Jimeng LoRA多场景应用:游戏原画概念图/国风壁纸/头像生成全流程 1. 项目简介 Jimeng LoRA是一个专门为LoRA模型测试和应用的轻量级图像生成系统。这个项目的核心特点是基于Z-Image-Turbo技术,能够让你只用加载一次基础模型,就能随时切换不…

作者头像 李华
网站建设 2026/8/10 15:25:47

Cosmos-Reason1-7B惊艳案例:从施工图纸图片推理承重结构合理性与隐患

Cosmos-Reason1-7B惊艳案例:从施工图纸图片推理承重结构合理性与隐患 1. 引言:当AI看懂施工图 想象一下,你是一位经验丰富的结构工程师,每天要面对成堆的施工图纸。你需要从密密麻麻的线条和标注中,快速判断出承重墙…

作者头像 李华