- Node.js 教程
- Node.js - 首页
- Node.js - 简介
- Node.js - 环境设置
- Node.js - 第一个应用程序
- Node.js - REPL 终端
- Node.js - 命令行选项
- Node.js - 包管理器 (NPM)
- Node.js - 回调函数概念
- Node.js - 上传文件
- Node.js - 发送电子邮件
- Node.js - 事件
- Node.js - 事件循环
- Node.js - 事件发射器
- Node.js - 调试器
- Node.js - 全局对象
- Node.js - 控制台
- Node.js - 进程
- Node.js - 应用程序扩展
- Node.js - 打包
- Node.js - Express 框架
- Node.js - RESTFul API
- Node.js - 缓冲区
- Node.js - 流
- Node.js - 文件系统
- Node.js MySQL
- Node.js - MySQL 入门
- Node.js - MySQL 创建数据库
- Node.js - MySQL 创建表
- Node.js - MySQL 插入数据
- Node.js - MySQL 从表中选择数据
- Node.js - MySQL WHERE 条件
- Node.js - MySQL 排序
- Node.js - MySQL 删除数据
- Node.js - MySQL 更新数据
- Node.js - MySQL 连接
- Node.js MongoDB
- Node.js - MongoDB 入门
- Node.js - MongoDB 创建数据库
- Node.js - MongoDB 创建集合
- Node.js - MongoDB 插入数据
- Node.js - MongoDB 查找数据
- Node.js - MongoDB 查询
- Node.js - MongoDB 排序
- Node.js - MongoDB 删除数据
- Node.js - MongoDB 更新数据
- Node.js - MongoDB 限制结果
- Node.js - MongoDB 连接
- Node.js 模块
- Node.js - 模块
- Node.js - 内置模块
- Node.js - 实用程序模块
- Node.js - Web 模块
- Node.js 有用资源
- Node.js - 快速指南
- Node.js - 有用资源
- Node.js - 讨论
Node.js - MongoDB 连接
MongoDB 是一个 NoSQL 数据库,它不支持关系型数据库(如 MySQL)中的 JOIN 操作。但是,可以通过调用 Collection 对象的 aggregate() 方法和 $lookup 阶段来实现类似的功能。
$aggregate() 函数
此函数对同一数据库中的另一个集合执行左外连接,以筛选“连接”集合中的文档以进行处理。
$lookup: 对同一数据库中的集合执行左外连接,以筛选“连接”集合中的文档以进行处理。$lookup 阶段会向每个输入文档添加一个新的数组字段。新数组字段包含来自“连接”集合的匹配文档。
要对输入文档中的字段与“连接”集合的文档中的字段之间执行相等匹配,$lookup 阶段具有以下语法:
{
$lookup:
{
from: <collection to join>,
localField: <field from the input documents>,
foreignField: <field from the documents of the "from" collection>,
as: <output array field>
}
}
$lookup 阶段中的参数如下:
| 序号 | 参数及描述 |
|---|---|
| 1 | from 指定同一数据库中要与其执行连接的集合。 from 是可选的,您可以改为在 $lookup 阶段中使用 $documents 阶段。例如,请参阅在 $lookup 阶段中使用 $documents 阶段。 |
| 2 | localField 指定来自输入到 $lookup 阶段的文档的字段。$lookup 对 localField 与 from 集合的文档中的 foreignField 执行相等匹配。 |
| 3 | foreignField 指定来自 from 集合中文档的字段。 |
| 4 | as 指定要添加到输入文档的新数组字段的名称。新数组字段包含来自 from 集合的匹配文档。 |
以下 SQL 查询对应于 $lookup 操作:
SELECT *, <output array field> FROM collection WHERE <output array field> IN ( SELECT * FROM <collection to join> WHERE <foreignField> = <collection.localField> );
示例
为了演示 MongoDB 中的 JOIN 操作,请创建两个集合:inventory 和 orders。
inventory 集合
( [
{ prodId: 100, price: 20, quantity: 125 },
{ prodId: 101, price: 10, quantity: 234 },
{ prodId: 102, price: 15, quantity: 432 },
{ prodId: 103, price: 17, quantity: 320 }
] )
orders 集合
( [
{ orderId: 201, custid: 301, prodId: 100, numPurchased: 20 },
{ orderId: 202, custid: 302, prodId: 101, numPurchased: 10 },
{ orderId: 203, custid: 303, prodId: 102, numPurchased: 5 },
{ orderId: 204, custid: 303, prodId: 103, numPurchased: 15 },
{ orderId: 205, custid: 303, prodId: 103, numPurchased: 20 },
{ orderId: 206, custid: 302, prodId: 102, numPurchased: 1 },
{ orderId: 207, custid: 302, prodId: 101, numPurchased: 5 },
{ orderId: 208, custid: 301, prodId: 100, numPurchased: 10 },
{ orderId: 209, custid: 303, prodId: 103, numPurchased: 30 }
] )
以下代码在 Collection 对象和 $lookup 阶段上调用 aggregate() 方法。
const {MongoClient} = require('mongodb');
async function main(){
const uri = "mongodb://:27017/";
const client = new MongoClient(uri);
try {
await client.connect();
await joindocs(client, "mydb", "orders", "inventory");
} finally {
await client.close();
}
}
main().catch(console.error);
async function joindocs(client, dbname, col1, col2){
const result = await client.db(dbname).collection('orders').aggregate([
{ $lookup:
{
from: 'inventory',
localField: 'prodId',
foreignField: 'prodId',
as: 'orderdetails'
}
}
]).toArray();
result.forEach(element => {
console.log(JSON.stringify(element));
});
}
$lookup 阶段允许您指定要与当前集合连接的集合以及应匹配的字段。
输出
{"_id":"658c4b14943e7a1349678bf3","orderId":201,"custid":301,"prodId":100,"numPurchased":20,"orderdetails":[{"_id":"658c4aff943e7a1349678bef","prodId":100,"price":20,"quantity":125}]}
{"_id":"658c4b14943e7a1349678bf4","orderId":202,"custid":302,"prodId":101,"numPurchased":10,"orderdetails":[{"_id":"658c4aff943e7a1349678bf0","prodId":101,"price":10,"quantity":234}]}
{"_id":"658c4b14943e7a1349678bf5","orderId":203,"custid":303,"prodId":102,"numPurchased":5,"orderdetails":[{"_id":"658c4aff943e7a1349678bf1","prodId":102,"price":15,"quantity":432}]}
{"_id":"658c4b14943e7a1349678bf6","orderId":204,"custid":303,"prodId":103,"numPurchased":15,"orderdetails":[{"_id":"658c4aff943e7a1349678bf2","prodId":103,"price":17,"quantity":320}]}
{"_id":"658c4b14943e7a1349678bf7","orderId":205,"custid":303,"prodId":103,"numPurchased":20,"orderdetails":[{"_id":"658c4aff943e7a1349678bf2","prodId":103,"price":17,"quantity":320}]}
{"_id":"658c4b14943e7a1349678bf8","orderId":206,"custid":302,"prodId":102,"numPurchased":1,"orderdetails":[{"_id":"658c4aff943e7a1349678bf1","prodId":102,"price":15,"quantity":432}]}
{"_id":"658c4b14943e7a1349678bf9","orderId":207,"custid":302,"prodId":101,"numPurchased":5,"orderdetails":[{"_id":"658c4aff943e7a1349678bf0","prodId":101,"price":10,"quantity":234}]}
{"_id":"658c4b14943e7a1349678bfa","orderId":208,"custid":301,"prodId":100,"numPurchased":10,"orderdetails":[{"_id":"658c4aff943e7a1349678bef","prodId":100,"price":20,"quantity":125}]}
{"_id":"658c4b14943e7a1349678bfb","orderId":209,"custid":303,"prodId":103,"numPurchased":30,"orderdetails":[{"_id":"658c4aff943e7a1349678bf2","prodId":103,"price":17,"quantity":320}]}
广告
