MongoDB小课堂: 深度掌握$lookup聚合——从基础语法到高级关联查询实战指南

手把手教你逆向京东搜索接口:H5ST 556位参数生成与V8补环境技巧 本文深入解析了京东搜索接口中关键的H5ST 556位参数生成机制,并提供了详细的逆向实战指南。针对其复杂的反爬虫环境检测,文章重点介绍了通过链式补环境技巧,在Node.js中完整模拟浏览器环境(包括原型链检测和指纹验证)的方法,帮助开发者成功绕过防护并生成有效参数。 阅读详情

背景:$lookup的核心作用与应用场景


跨集合关联(Cross-collection Joining)是MongoDB聚合框架的核心能力,而$lookup是实现这一功能的关键阶段

与传统SQL的JOIN不同:

  • 文档友好型设计:结果以嵌套文档形式输出,保留NoSQL灵活性
  • 非破坏性操作:原文档结构不变,仅添加新字段(如forex_data)
  • 数组智能处理:自动展开数组元素进行多值匹配(等价于$in查询)

典型应用场景:

  1. 银行账户系统关联实时汇率数据
  2. 电商订单关联商品详情
  3. 用户行为日志关联用户画像

$lookup 阶段的核心作用

$lookup 是 MongoDB 聚合管道中的特殊阶段,与其他仅操作当前管道文档的阶段不同,它允许跨集合查询。其核心机制是:

  • 查询对象:指向同一数据库中的另一个集合(称为 查询集合,与管道集合分离)。
  • 输出修改:管道中的每篇文档会新增一个字段,其值为查询集合中匹配的文档内容。

关键要点:

  • 跨集合关联:实现类似 SQL JOIN 的能力,但以文档嵌套形式输出
  • 非破坏性操作:原文档结构不变,仅添加新字段

语法详解与操作模式


1 )基础语法与参数解析

语法参数:

参数作用
from指定查询集合名称(需在同一数据库)。
localField管道文档中用于匹配的字段(如 accounts.currency)。
foreignField查询集合中用于匹配的字段(如 forex.CCY)。
as存储匹配结果的新字段名(如 forexData)。
{
  $lookup: {
    from: "forex",          // 目标集合名(同一数据库)(不可跨库)
    localField: "currency", // 当前集合匹配字段
    foreignField: "CCY",    // 目标集合匹配字段
    as: "forex_data"       // 输出字段名(始终为数组)
  }
}

参数特性:

  1. 跨集合匹配:仅当 localField 与 foreignField 值严格相等时关联文档
  2. 结果结构:as 字段始终返回数组,无匹配时为空数组 []
  3. 字段兼容性:
    • localField 支持数组字段(自动展开多值匹配)
    • 字段不存在/null/空数组时视为无匹配

核心约束:

  1. 无法跨数据库操作查询集合
  2. 当 localField 为数组时,匹配逻辑为 多值遍历查询(每个元素独立匹配)
  3. 关联失败时,as 字段返回空数组 []

示例集合初始化(外汇汇率集合)

db.Forex.insertMany([
  { currency: "USD", rate: 1.0, date: ISODate("2018-12-21") },
  { currency: "GBP", rate: 0.78, date: ISODate("2018-08-15") },
  { currency: "CNY", rate: 6.91, date: ISODate("2018-12-21") }
])

操作示例:

// MongoDB 原生语法  
db.accounts.aggregate([  
  {  
    $lookup: {  
      from: "forex",          // 查询集合名称  
      localField: "currency", // 管道文档字段  
      foreignField: "CCY",    // 查询集合字段  
      as: "forex_data"         // 输出新字段名  
    }  
  }  
]);  

输出文档分析:

账户文档特征forex_data 结果原因说明
currency: ["CNY","USD"]包含 CNY/USD 文档的数组数组元素分别匹配成功
currency: "GBP"包含 GBP 文档的数组单值匹配成功
currency: null空数组 []空值无法匹配任何文档
无 currency 字段空数组 []字段缺失导致匹配失败
账户字段 currency 状态forex_data 输出结果案例说明
数组 ["CNY","USD"]匹配文档数组(长度=2)Alice 账户关联两条汇率
字符串 "GBP"单文档数组(长度=1)Bob 账户关联一条汇率
空数组 []空数组 []David 账户无匹配
字段不存在/null空数组 []Charlie/Eddie 无匹配
输入字段状态输出结果案例说明
数组 ["CNY","USD"]匹配文档数组(长度≥2)多币种账户关联多条汇率
单值 "GBP"单文档数组(长度=1)单币种账户关联一条汇率
null/空数组/字段缺失空数组 []无匹配数据时返回空集

输出逻辑详解:

  1. 匹配成功:

    • 若 localField 值为数组(如 ["CNY", "USD"]),forexData 将包含所有匹配文档(如 CNY 和 USD 汇率文档)
    • 若为单值(如 "GBP"),forexData 为单文档数组
  2. 匹配失败:

    • 字段缺失(如无 currency 字段)、空数组或 null 时,forexData 返回 空数组 []

技术细节:

  • 数组字段处理:localField 为数组时,自动执行 多值匹配(相当于隐式 $in 查询)
  • 空值处理:MongoDB 严格校验字段存在性,未定义字段直接视为无匹配

要点:

  • 字段值严格相等匹配(区分大小写)
  • 确保foreignField建立索引避免全表扫描

2 ) 基础字段匹配实战:账户与汇率数据关联

场景描述

  • 管道集合:accounts(账户文档)
  • 查询集合:forex(汇率文档),结构如下:
    { "_id": ObjectId, "CCY": "USD", "rate": 6.48, "date": ISODate("2018-12-21") }
    

聚合操作

// MongoDB 原生语法 
db.accounts.aggregate([
  {
    $lookup: {
      from: "forex",
      localField: "currency",  // 账户支持的货币字段(支持数组)
      foreignField: "CCY",     // 外汇集合的货币代码字段
      as: "forex_data"        // 存储匹配的汇率文档 
    }
  }
]);

关键点:当 localField 为数组时,$lookup 会自动遍历每个元素执行独立匹配,最终合并结果至 as 字段

3 ) 数组展开协作:$unwind最佳实践,优化一对多匹配

当需要文档级1:1匹配时,需组合$unwind:

db.accounts.aggregate([
  { $unwind: "$currency" },     // 展开货币数组
  { $lookup: { ... } }          // 执行单值关联
]);

示例

当需展开数组字段实现 1:1 文档匹配 时,需配合 $unwind:

db.accounts.aggregate([  
  { $unwind: "$currency" },      // 展开 currency 数组  
  {  
    $lookup: {  
      from: "forex",  
      localField: "currency",  
      foreignField: "CCY",  
      as: "forexData"  
    }  
  }  
]);  

输出变化:

  • 原数组字段文档(如 Alice 的 currency: ["CNY","USD"])被拆分为两篇独立文档。
  • forexData 字段仅包含 单文档数组(如 CNY 文档、USD 文档各一篇)。

为何必要?

  • $unwind 会过滤无效文档(如无 currency 字段的文档),确保后续 $lookup 仅处理可匹配数据。

效果对比:

  • 输入文档:5个账户(含2个多币种账户)
  • 无$unwind:输出5篇文档(含嵌套数组)
  • 有$unwind:输出7篇文档(数组元素拆分为独立文档)

高级管道查询(MongoDB 3.6+)

  1. 非关联查询(Uncorrelated)
    pipeline: [
      { $match: { date: ISODate("2018-12-21") } } // 独立过滤条件 
    ]
    

特征:所有文档获得相同关联结果(无视原始数据特征)

  1. 关联查询(Correlated)
    let: { bal: "$balance" },  // 声明管道变量
    pipeline: [
      { $match: {
        $expr: {               // 必须使用表达式操作符
          $and: [
            { $eq: ["$date", ISODate("2018-12-21")] },
            { $gt: ["$$bal", 100] }  // $$引用变量
          ]
        }
      }}
    ]
    

关键技术点:

  1. let绑定当前文档字段到变量(如$$bal)
  2. $expr是唯一支持变量引用的操作符
  3. 双$语法区分字段($date)与变量($$bal)

高级用法:自定义管道查询(Correlated & Uncorrelated)


语法扩展参数:

参数作用
pipeline在查询集合上执行的子聚合管道(如筛选、投影)。
let将管道文档字段映射为变量,供 pipeline 使用(需 $$ 语法引用)。

1 )非关联查询(Uncorrelated Query)
场景:仅基于查询集合的条件过滤(不依赖管道文档)。

db.accounts.aggregate([  
  {  
    $lookup: {  
      from: "forex",  
      pipeline: [  
        {  
          $match: { date: ISODate("2018-12-21") } // 仅匹配指定日期的汇率  
        }  
      ],  
      as: "forexData"  
    }  
  }  
]);  

输出特点:

  • 所有管道文档的 forexData 字段内容相同(如仅包含 2018-12-21 的 USD/CNY 汇率)。
  • 因查询条件与管道文档无关联,结果独立于原数据。

2 )关联查询(Correlated Query)
场景:联合管道文档与查询集合的条件(如“仅向高余额用户提供汇率”)。

db.accounts.aggregate([  
  {  
    $lookup: {  
      from: "forex",  
      let: { bal: "$balance" }, // 映射管道字段 balance 到变量 $$bal  
      pipeline: [  
        {  
          $match: {  
            $expr: { // 必须使用 $expr 操作符  
              $and: [  
                { $eq: ["$date", ISODate("2018-12-21")] },  
                { $gt: ["$$bal", 100] } // 引用管道变量 $$bal  
              ]  
            }  
          }  
        }  
      ],  
      as: "forexData"  
    }  
  }  
]);  

关键技术点:

  1. let 映射:将管道字段(如 balance)声明为变量(如 $$bal)
  2. $expr 强制使用:在 pipeline 中引用管道变量时必须包裹 $expr
  3. 双 $ 语法:$$bal 表示变量,$date 表示查询集合字段

案例:金融账户汇率关联实战


1 ) 数据集结构

$lookup关联
accounts
+_id: ObjectId
+name: String
+balance: Number
+currency: String[]
forex
+_id: ObjectId
+CCY: String
+rate: Number
+date: Date

2 ) 场景化查询示例

案例1:基础货币匹配

// 所有账户关联实时汇率
db.accounts.aggregate([{
  $lookup: {
    from: "forex",
    localField: "currency",
    foreignField: "CCY",
    as: "real_time_rates"
}}]);

案例2:高净值客户专属汇率

// 仅当余额>100时关联当日汇率
db.accounts.aggregate([{
  $lookup: {
    from: "forex",
    let: { accBalance: "$balance" },
    pipeline: [{
      $match: {
        date: ISODate("2018-12-21"),
        $expr: { $gt: ["$$accBalance", 100] }
    }}],
    as: "vip_rates"
}}]);

输出文档样例:

{
  "_id": ObjectId("5f7b1d9c8e4a2e1d2c3b4a5d"),
  "name": "Alice",
  "balance": 150,
  "currency": ["CNY","USD"],
  "vip_rates": [ 
    { "CCY": "CNY", "rate": 6.91, "date": "2018-12-21" },
    { "CCY": "USD", "rate": 1.0, "date": "2018-12-21" }
  ]
}

3 ) NestJS集成实现

import { PipelineStage } from 'mongoose';
 
const getVipRatesPipeline = (): PipelineStage[] => [
  {
    $lookup: {
      from: 'forex',
      let: { balance: '$balance' },
      pipeline: [
        { 
          $match: { 
            date: new Date('2018-12-21'),
            $expr: { $gt: ['$$balance', 100] }
          }
        }
      ],
      as: 'vip_rates'
    }
  }
];
 
@Injectable()
export class AccountService {
  async getVipAccounts() {
    return this.accountModel.aggregate(getVipRatesPipeline());
  }
}

综合示例


1 ) 方案1

基于 Mongoose 实现

import { Injectable } from '@nestjs/common';  
import { InjectModel } from '@nestjs/mongoose';  
import { Model, PipelineStage } from 'mongoose';  
import { AccountDocument } from './schemas/account.schema';  
 
@Injectable()  
export class ForexService {  
  constructor(  
    @InjectModel('Account') private accountModel: Model<AccountDocument>,  
  ) {}  
 
  // 基础 $lookup 查询  
  async getAccountsWithForex() {  
    const pipeline: PipelineStage[] = [  
      {  
        $lookup: {  
          from: 'forex',  
          localField: 'currency',  
          foreignField: 'CCY',  
          as: 'forexData',  
        },  
      },  
    ];  
    return this.accountModel.aggregate(pipeline).exec();  
  }  
 
  // 高级关联查询(余额 > 100 的用户)  
  async getHighBalanceAccountsWithForex() {  
    const pipeline: PipelineStage[] = [  
      {  
        $lookup: {  
          from: 'forex',  
          let: { bal: '$balance' },  
          pipeline: [  
            {  
              $match: {  
                $expr: {  
                  $and: [  
                    { $eq: ['$date', new Date('2018-12-21')] },  
                    { $gt: ['$$bal', 100] },  
                  ],  
                },  
              },  
            },  
          ],  
          as: 'forexData',  
        },  
      },  
    ];  
    return this.accountModel.aggregate(pipeline).exec();  
  }  
}  

2 )方案2

import { PipelineStage } from 'mongoose';
 
const lookupPipeline: PipelineStage[] = [
  {
    $lookup: {
      from: 'forex',
      let: { accountBalance: '$balance' },
      pipeline: [
        { 
          $match: { 
            date: new Date('2018-12-21'),
            $expr: { $gt: ['$$accountBalance', 100] } 
          } 
        }
      ],
      as: 'forex_data'
    }
  }
];
 
@Injectable()
export class AccountService {
  async getAccountsWithForex() {
    return this.accountModel.aggregate(lookupPipeline).exec();
  }
}

3 ) 方案3

// nestjs.service.ts
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { AccountDocument } from './account.schema';
 
@Injectable()
export class AccountService {
  constructor(
    @InjectModel('Account') private accountModel: Model<AccountDocument>
  ) {}
 
  async getAccountsWithForex() {
    return this.accountModel.aggregate([
      {
        $lookup: {
          from: 'forex',
          let: { accBalance: '$balance', currencies: '$currency' },
          pipeline: [
            { 
              $match: { 
                $expr: { 
                  $and: [
                    { $in: ['$currency', '$$currencies'] },
                    { $gt: ['$$accBalance', 100] }
                  ] 
                } 
              } 
            }
          ],
          as: 'forex_data'
        }
      }
    ]);
  }
}

关键实现说明:

  1. $in 操作符用于匹配数组字段 currencies
  2. let 定义的 accBalance 在 $expr 中通过 $$ 引用
  3. 管道语法完全兼容 MongoDB 原生语法

SQL 等价实现参考(LEFT JOIN 对比)

/* 基础字段匹配(等效简单 $lookup) */
SELECT a.*, f.* 
FROM accounts a 
LEFT JOIN forex f ON a.currency = f.CCY;
 
/* 高级条件关联(等效 Pipeline 模式)*/
SELECT a.*, f.* 
FROM accounts a
LEFT JOIN forex f 
  ON f.date = '2018-12-21' 
  AND a.balance > 100; 

关键策略与最佳实践

1 ) 性能优化指南

策略效果实施方法
索引优化查询提速3-10倍在foreignField创建索引
前置过滤减少处理文档量在$lookup前使用$match
结果集限制降低内存消耗在子管道添加$limit/$project

2 ) 版本兼容与设计建议

  • 版本边界:
    • 基础语法 → MongoDB 3.2+
    • 管道语法 → MongoDB 3.6+
  • 架构选择原则:
    是
    否
    是
    否
    频繁关联查询
    数据冗余/嵌入文档
    使用$lookup
    实时性要求高
    ETL预处理

3 )核心知识点总结

  1. 空值处理三原则:

    • 字段缺失 ⇒ 无匹配
    • null/空数组 ⇒ 返回[]
    • 未声明的变量 ⇒ 视为null
  2. SQL等价对比:

    MongoDB 语法SQL 等价操作
    基础$lookupLEFT JOIN ON fieldA = fieldB
    管道$lookupLEFT JOIN ON condition1 AND condition2
  3. 错误规避手册:

    • ❌ 忘记$expr包裹表达式 → 变量引用失败
    • ❌ 混淆$var与$$var语法 → 字段解析错误
    • ❌ 未处理空数组 → 意外丢失文档

注意事项

  1. 字段匹配规则:
    • 空数组/null/字段缺失均导致关联失败 → as 字段返回 []
    • 数组字段自动展开为多条件匹配(OR 逻辑)
  2. 性能优化方向:
    • 在查询集合的 foreignField 上建立索引
    • 使用 pipeline 优先过滤查询集合文档
  3. 语法限制:
    • 跨集合变量必须通过 let + $$var 显式声明
    • 嵌套聚合中必须使用 $expr 操作符组合条件
  4. 设计本质:
    $lookup 本质是 左外连接(Left Outer Join),主集合文档必返回,子集匹配结果以数组形式嵌入

关键总结

  1. 字段匹配限制:基础模式依赖字段值严格相等,无法实现范围查询
  2. 数组处理逻辑:$lookup 自动处理数组字段,无需预先展开
  3. 性能影响:管道模式中的复杂聚合可能显著增加查询开销
  4. 空值策略:未匹配时返回空数组,需后续 $match 过滤
  5. 版本差异:相关查询(let/pipeline)仅支持 MongoDB 3.6+

通过组合 $unwind, $match 等阶段,可实现关系型数据库中多表 JOIN 与条件过滤的综合效果,同时保留文档模型的灵活性优势

最终建议:在频繁跨集合查询场景中,评估嵌入式文档或关系型数据库的适用性,平衡灵活性与性能。

总结


模块核心要点
基础语法四参数结构(from/localField/foreignField/as),严格值匹配,数组自动展开
高级查询let绑定变量→pipeline过滤→$expr引用变量,实现动态关联条件
性能优化索引是基石,前置过滤减少数据集,避免子管道复杂聚合
版本适配管道语法需≥3.6,生产环境推荐≥4.4版本获得性能增强
设计哲学非范式化优先,仅当关联成为性能瓶颈时才考虑范式化或混合数据库方案
  1. 匹配机制本质:

    • 基础用法:等价于 查询集合.find({ foreignField: { $in: localFieldArray } })。
    • 性能注意:确保 foreignField 有索引,避免全集合扫描。
  2. 变量作用域规则:

    • pipeline 内默认无法访问管道文档字段,必须通过 let + $$var 中转
    • $expr 是唯一操作符,支持在 $match 中组合查询集合字段与管道变量
  3. 设计模式建议:

    • 嵌套深度:$lookup 结果默认为数组,需结合 $unwind 和 $group 扁平化数据
    • 替代方案:频繁关联查询时,考虑数据冗余(嵌入文档)或 引用数据库(如 PostgreSQL FDW)
  4. 版本兼容性:

    • 非关联查询:仅支持 MongoDB 3.6+
    • 关联查询:MongoDB 3.6 引入 pipeline 语法,替代旧版 localField/foreignField 局限性

最终输出逻辑:

  • $lookup 的核心价值在于 按需关联异构数据,而非强制范式化。其灵活性允许实现:
  • 简单外键式关联(基础语法)
  • 动态过滤的跨集合查询(管道语法)
  • 业务逻辑驱动的数据注入(变量映射)
华为OD机考双机位C卷 - 信道分配(Java & Python& JS & C/C++ & GO ) 华为OD机考双机位C卷 - 信道分配 阅读详情

相关推荐

igh ethercat 实时性测试

组备注std(us)max(us)a无锁核,无rt补丁8.38108b锁核+FIFO调度+内存锁定,无rt补丁0.9216c锁核+FIFO调度+内存锁定,+rt补丁0.9922可以看到 a组 使用ethercat不做其他优化,周期抖动非常大,且max能达到 100 多 us;通过 锁核+FIFO调度+内存锁定 进行优化,可以看到 抖动明显降低,且max 为 20 us 左右;

qq_43353632的博客 2312

PEMFC电化学入门:从电流密度到Tafel公式的实战计算指南

本文详细介绍了PEMFC电化学的基础知识,从电流密度计算到Tafel公式的应用,提供了实战计算指南。通过代码示例和常见问题排查,帮助工程师快速掌握燃料电池性能优化的关键参数,如交换电流密度和活化损失计算,适用于汽车动力和分布式发电等领域。

weixin_29229055的博客 552

MongoDB之多表关联查询-$lookup

文章目录一、聚合框架二、 $lookup的功能及语法三、案例 一、聚合框架 聚合框架是MongoDB的高级查询语言,它允许我们通过转换和合并多个文档中的数据来生成新的单个文档中不存在的信息。 聚合管道操作主要包含下面几个部分: 命令 功能描述 备注 $project 指定输出文档里的字段 $match 选择要处理的文档,与fine()类似 $limit 限制传递给下一步的文档数量 $skip 跳过一定数量的文档 $unwind 扩展数组,为每个数组入口生成一个输出文档

xtho62的博客 1万+

MuJoCo与Isaac Sim的无缝对接:利用USD导出功能实现强化学习场景的跨平台迁移

本文详细介绍了如何通过USD导出功能实现MuJoCo与Isaac Sim的无缝对接,助力强化学习场景的跨平台迁移。文章解析了USD格式的核心优势,包括分层合成、物理属性继承和时间轴动画,并提供了从MJCF到USD的完整转换流程及在Isaac Sim中的高级应用技巧,帮助开发者高效迁移和优化强化学习环境。

weixin_29073241的博客 519

RAG-Anything 实战:构建企业级多模态知识图谱问答系统

本文详细介绍了如何利用RAG-Anything构建企业级多模态知识图谱问答系统,解决跨模态文档处理的痛点。通过架构设计解析、部署实战指南和典型业务场景解决方案,帮助企业实现高效的知识管理和智能检索,提升决策效率。

weixin_29089057的博客 386

MongoDB——聚合管道之$lookup操作

目录一、$lookup的概述二、$lookup的语法三、数据准备四、关联查询示例 一、$lookup的概述 Mongodb 3.2版本新增,主要用来实现多表关联查询, 相当关系型数据库中多表关联查询。 每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组(可根据需要命名新key )。数组列存放的数据是来自被Join集合的适配文档,如果没有,集合为空(即 为[ ]) 二、$lookup的语法 $lookup的语法 db.collection.aggregate([

小志的博客 4955

别再只用跳层连接了!手把手教你用DASI和MDCR模块提升红外小目标检测精度

本文详细介绍了如何利用DASI和MDCR模块提升红外小目标检测精度。通过分析传统跳层连接的缺陷,提出维度感知的特征选择性融合(DASI)和多尺度感受野精炼器(MDCR)的创新方案,显著提升小目标检测性能。实验证明,该方法在多个场景下AP@0.5提升达15.4%,特别适用于安防监控和遥感图像分析。

weixin_28715081的博客 224

mongodb 3.6 $lookup 使用

3.6之前的mongobd lookup 只能是形如 { $lookup: { from: <collection to join>, localField: <field from the input documents>, foreignField: <field from the documents ...

zwy 1365

RT-DETR改进策略【损失函数篇】| 2024 引进Focaler-IoU损失函数 加强边界框回归 (Focaler-DIoU、Focaler-GIoU、Focaler-CIoU等)

本文记录的是改进RT-DETR的损失函数,将其替换成。现有研究通过利用边界框之间的几何关系来提高回归性能,但忽略了困难样本和简单样本分布对边界框回归的影响。不同检测任务中困难样本和简单样本的分布不同,对于简单样本占主导的检测任务,关注简单样本的边界框回归有助于提高检测性能;对于困难样本比例较高的检测任务,需要关注困难样本的边界框回归。,提高检测器在不同检测任务中的性能。实现的。

Limiiiing的博客 1925

Altium Designer(AD24/25)如何在PCB设计阶段做阻抗匹配

目前阻抗匹配多直接有制版厂进行,PCB设计师在设计阶段可不关注阻抗设计,在加工阶段只需标注需要控制的阻抗线,制板厂即可按照要求对阻抗线进行调整和控制。但是对于设计师来讲掌握阻抗线的设计方法也是非常必要的。本文介绍Altium Designer(AD24/25)如何在PCB设计阶段做阻抗匹配。

fydar的博客 895

mongodb 3.x 之实用新功能窥看[2] ——使用$lookup做多表关联处理

  这篇我们来看mongodb另一个非常有意思的东西,那就是$lookup,我们知道mongodb是一个文档型的数据库,而且它也是最像关系型数据库的 一种nosql,但是呢,既然mongodb是无模式的,自然就很难在关系型数据库中非常擅长的多表关联上发挥作用,在这之前,我们可以使用DbRef,但 是呢,在mongodb 3.2 中给你增加了一个相当牛逼的手段,那就是$lookup,而且放到了a...

weixin_34066347的博客 1460

GStreamer 源代码入门

GStreamer 是一个高度模块化的多媒体框架,其源代码结构清晰,设计精良。

深之JohnChen的专栏 955

【MongoDB】使用$lookup做多表关联处理

  这篇我们来看mongodb另一个非常有意思的东西,那就是$lookup,我们知道mongodb是一个文档型的数据库,而且它也是最像关系型数据库的一种nosql,但是呢,既然mongodb是无模式的,自然就很难在关系型数据库中非常擅长的多表关联上发挥作用,在这之前,我们可以使用DbRef,但是呢,在mongodb 3.2 中给你增加了一个相当牛逼的手段,那就是$lookup,而且放到了aggre...

Mr_EvanChen的Blog 5391

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

MongoDB 之 aggregate $lookup 关联查询 进阶篇

 需求:要对 topics 问题表根据 teach_id(教师ID),tips._id(问题标签ID) 字段进行分组统计教师的答题情况生成报表,所以得根据 教师ID,标签ID 关联查询出 教师信息,标签信息 用作报表展示。 本文基于 MongoDB V3.2 聚合查询语法,V3.6 可使用更多的特性实现 topics 表数据结构: { "_id" : "ffffea46-ab7d-4c1...

Evan 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Mac下MySQL的配置和修改密码以及忘记密码后的重置密码

1 ) Mac下MySQL的配置和修改密码 2 ) 忘记并重置密码 启动MySQL服务,通过 $ps aux | grep mysql 判断是否启动该服务,若未启动,则到 系统偏好设置/MySQL面板 启动服务 软件默认会安装到:/usr/local/mysql 目录,进入这个目录下的bin目录:$cd /usr/local/mysql/bin 执行 $./mysql -u root -p 通过初始密码登录MySQL 通...

Wang的专栏 6259

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

mysql数据库的一些简单的sql语句 内连接 - 表的关联查询

# 创建一个user表 create table users( id int primary key auto_increment, name varchar(20), dpt_id int ); # 向user表中插入数据 insert into users values (null,'刘备',1), (null,'关羽',2), (null,'赵

Wang的专栏 4264

数据库、数据库类型、RDBMS以及MySQL

什么是数据库 数据库 就是按一定的结构来组织、存储和管理数据的仓库 可以很方便的进行crud, 能提供多个用户共享、具有尽可能小的冗余度、与应用程序批次独立的数据集合。 其他持久储存缺点:文件操作(不灵活) 数据库类型 包括 : 关系型 和 非关系型 【关系型】 MySQL MariaDB PostgreSQL Microsoft SQL Server Oracle数据库 Sybase 【...

Wang的专栏 4039

Eggjs笔记:Eggjs集成ElasticSearch及CRUD操作

相关文档 https://www.elastic.co/guide/index.html https://www.elastic.co/guide/en/elasticsearch/client https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/configuration.html https://www.elastic.co/guide/en/elasticsearch/client/javascrip

Wang的专栏 3530

Redis: 集群高可用之故障转移和集群迁移

若要检查源和目标是否数据统一,还可选择阿里配套工具RedisFullCheck。3.4 使用 RedisFullCheck 工具检查。下载官方编译好的工具包,直接解压后就能使用。故障转移,包括自动故障转移和手动故障转移。运行之后,就给一个反馈结果,如果是。1.2 原集群与目标集群结构不一致。1.1 原集群与目标集群结构一致。2 ) 手动故障转移。

Wang的专栏 2918

Python笔记:基于Django框架的数据库设计

概述 需要根据《项目建议书》、《需求说明书》、界面原型、各种标准规范对数据库进行设计, 我们目前先参考这一设计图 结构设计 1 ) 找实体 实体是实体-关系模型的基本对象, 是现实世界中各种事物的抽象。 凡是可以相互区 开并可以被识 的事、物、概念等对象均可认为是实体。 基本的实体列表如下: 会员 类别 商品 订单 订单详情 收货地址 商品评论 商品图片 友情链接 站内公告 … ...

Wang的专栏 2772

Elastic Stack梳理:集群搭建指南之高可用架构与实战部署

本文介绍了Elasticsearch分布式架构和Cerebro监控工具的部署策略。主要内容包括: ES集群角色划分(主节点、数据节点、协调节点)及功能说明 Cerebro监控工具的独立部署方法和访问方式 集群拓扑规划示例,包含节点IP分配和架构拓扑图 各类型节点的配置原则和数量计算公式 高可用主节点配置要点及示例配置 生产环境优化建议,包括分片规划、硬件配置和安全措施 文章提供了完整的集群部署方案,涵盖从基础概念到具体实施的各个环节,适用于不同规模的ES集群建设。

Wang的专栏 2545

Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息

当从节点获得足够多的选票时,它就会成为新的主节点,并增加自己的configEpoch来更新槽位配置。在Redis集群中,纪元的更新通常是由节点间的通信和状态变更触发的。例如,当某个节点接收到来自其他节点的状态变更通知时,它会比较通知中的纪元与自己的纪元。如果通知中的纪元更大,则更新自己的纪元。确保集群状态的一致性:通过递增的纪元,集群中的节点可以确保它们对集群状态的认知是一致的。通过递增的纪元版本号,集群中的节点可以确保它们对集群状态的认知是一致的,并解决可能出现的配置冲突问题。4 )纪元的更新机制。

Wang的专栏 2466

MySQL: 数据库性能的决定性因素之从双十一大促高并发场景看系统瓶颈与优化路径

电商大促期间,数据库面临高并发写入、连接数暴增、慢查询积压等核心挑战。本文分析了锁竞争、主从延迟等关键性能瓶颈,并提出多种优化方案:1)使用乐观锁通过版本号控制库存超卖;2)CAS机制实现无锁并发;3)分布式锁协调多节点操作。这些方案在保证数据一致性的同时提升吞吐量,适用于库存扣减、订单创建等典型场景,有效解决数据库扩展难题。

Wang的专栏 2426

Redis: Sentinel哨兵监控架构及环境搭建

在主从模式下,我们通过从节点只读模式提高了系统的并发能力并发不断增加,只需要扩展从节点即可,只要主从服务器之间,网络连接正常主服务器就会将写入自己的数据同步更新给从服务器,从而保证主从服务器的数据相同在这种架构下,它仍然是有一些缺点的,比如说它的可靠性保证不是很好,因为主从模式下,主节点故障了便无法提供写入的服务现在,我们通过哨兵来解决这个问题然后,主节点其实写的压力也是并没有被释放的包括主从之间的数据是相同的,它还有数据冗余一个问题后面集群也会解决这个问题。

Wang的专栏 2181

MongoDB小课堂: 高级查询操作符与游标管理综合指南之深度整合逻辑操作符、字段处理、数组查询与游标控制的最佳实践

MongoDB查询操作符与游标管理摘要 本文整合了MongoDB常用查询操作符和游标管理的关键知识点: 比较操作符: $in和$nin用于多值匹配,注意$nin会包含字段缺失文档 结合$exists可处理字段缺失问题 逻辑操作符: $and可简写为逗号分隔条件 $or可用$in优化等值查询性能 $not和$nor需谨慎处理字段缺失 字段操作符: $exists检查字段存在性 $type支持按BSON类型筛选 数组操作符: $all要求包含所有指定元素 $elemMatch匹配满足条件的数组元素 正则表达式:

Wang的专栏 2145
上一篇: MongoDB小课堂: 索引核心机制深度剖析与高效应用实践指南
下一篇: MongoDB小课堂: 构建高可用股票仓位管理API服务(Express+Mongoose全栈实战)
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值