MongoDB聚合:$lookup

MongoDB-aggregate+lookup关联查询(MongoDB多表联接) MongoDB的lookup,对同一数据库中的未分片集合执行左外连接,将两个集合,根据指定的字段进行等值筛选联接,以方便对联接后的结果集进行后续处理。对于被联接的集合,lookup阶段会添加一个新的数组字段,里面的元素是一个被"{}"包裹的,被联接集合与本地集合相匹配的数据行,lookup阶段将这些重塑后的文档传递到下一阶段。如let或者pipeline以方便做后续的处理,如定义变量,聚合操作等。 阅读详情
AI摘要

本文主要介绍MongoDB聚合的$lookup用法。外连接是数据库查询常用特性,$lookup会给输入文档新增数组字段。文中详细说明了$lookup各参数含义,还通过多种示例,如单字段连接、数组字段外连接等,展示其在不同场景下的使用方法及聚合结果。

外连接是在数据库查询中经常用到的特性,通过连接可以对同一数据库的一个集合执行左外连接,并连接集合的文档进行筛选操作。MongoDB聚合的$lookup会给每个输入的文档新增一个数组字段,连接集合中符合匹配条件的文档会放在新增的数组字段中,重塑后的文档会被传递到管道的下一阶段。下面详细介绍下聚合连接的用法。

$lookup的用法

{
   $lookup:
      {
        from: <要连接的集合>,
        localField: <输入集合的字段>,
        foreignField: <要连接集合的字段>,
        let: { <var_1>: <表达式>, …, <var_n>: <表达式> },
        pipeline: [ <要运行的管道操作> ],
        as: <输出数组的字段名>
      }
}
  • from:指定要连接的集合(要求同一个库)。另外,此处也可以使用$documents关键字,相当于使用常量文档。
  • localField:指定输入集合中的字段,这个字段会与连接集合的字段进行匹配。如果指定的字段不存在,则会用空值替代(注意:字段名写错不会报错哦,会用空值替代)
  • foreignField:链接集合中进行匹配的字段,如果字段不存在,也会被当做空值。
  • let:可选,let可以引入输入文档的字段用于pipeline管道参数。引入变量需要使用$$<variable>进行访问。
  • pipeline:用于from参数指定集合的管道操作,它决定了连接集合的返回结果,当管道元素为0即pipeline=[]时返回结果。pipeline阶段不能包含$out和$merge。pipeline不能直接访问外连文档中的字段,需要用let选项来声明后才能使用。
  • as:指定要添加到输入文档中的新数组字段的名称。新数组字段包含 from 集合中的匹配文档。如果输入文档中已存在指定的名称,现有字段将被覆盖。
    let引入变量的注意事项:
    • let引入的变量可以用于pipeline参数的各个阶段包括内嵌的$lookup阶段。
    • pipeline的$match阶段需要使用$expr操作符才能访问引入的变量
    • 当在$expr操作符中使用$eq、$lt、$lte、$gt、$gte等比较操作符时,可以使用到引用集合的索引,但是要注意下面的限制:
      • 无法使用复合索引
      • 不能用于数组或未定义类型
      • 比较操作涉及的字段路径不能大于一。
    • pipeline中的非$match阶段访问变量不需要$expr操作符

举例

最简单的单字段连接

创建order集合,并添加下列数据

db.orders.insertMany( [
   { "_id" : 1, "item" : "almonds", "price" : 12, "quantity" : 2 },
   { "_id" : 2, "item" : "pecans", "price" : 20, "quantity" : 1 },
   { "_id" : 3  }
] )

创建inventory集合,并添加下列数据:

db.inventory.insertMany( [
   { "_id" : 1, "sku" : "almonds", "description": "product 1", "instock" : 120 },
   { "_id" : 2, "sku" : "bread", "description": "product 2", "instock" : 80 },
   { "_id" : 3, "sku" : "cashews", "description": "product 3", "instock" : 60 },
   { "_id" : 4, "sku" : "pecans", "description": "product 4", "instock" : 70 },
   { "_id" : 5, "sku": null, "description": "Incomplete" },
   { "_id" : 6 }
] )

集合order通过item字段和inventory的sku字段进行连接:

db.orders.aggregate( [
   {
     $lookup:
       {
         from: "inventory",
         localField: "item",
         foreignField: "sku",
         as: "inventory_docs"
       }
  }
] )

聚合结果:

{
   "_id" : 1,
   "item" : "almonds",
   "price" : 12,
   "quantity" : 2,
   "inventory_docs" : [
      { "_id" : 1, "sku" : "almonds", "description" : "product 1", "instock" : 120 }
   ]
}
{
   "_id" : 2,
   "item" : "pecans",
   "price" : 20,
   "quantity" : 1,
   "inventory_docs" : [
      { "_id" : 4, "sku" : "pecans", "description" : "product 4", "instock" : 70 }
   ]
}
{
   "_id" : 3,
   "inventory_docs" : [
      { "_id" : 5, "sku" : null, "description" : "Incomplete" },
      { "_id" : 6 }
   ]
}

数组字段外连接

如果 localField 是数组,会把localField的每个元素与foreignField 匹配,且无需 $unwind,举个例子。
创建classes集合并添加下列记录:

db.classes.insertMany( [
   { _id: 1, title: "Reading is ...", enrollmentlist: [ "giraffe2", "pandabear", "artie" ], days: ["M", "W", "F"] },
   { _id: 2, title: "But Writing ...", enrollmentlist: [ "giraffe1", "artie" ], days: ["T", "F"] }
] )

创建 members 集合并添加下列记录:

db.members.insertMany( [
   { _id: 1, name: "artie", joined: new Date("2016-05-01"), status: "A" },
   { _id: 2, name: "giraffe", joined: new Date("2017-05-01"), status: "D" },
   { _id: 3, name: "giraffe1", joined: new Date("2017-10-01"), status: "A" },
   { _id: 4, name: "panda", joined: new Date("2018-10-11"), status: "A" },
   { _id: 5, name: "pandabear", joined: new Date("2018-12-01"), status: "A" },
   { _id: 6, name: "giraffe2", joined: new Date("2018-12-01"), status: "D" }
] )

下面是把classes和members进行连接,并且根据enrollmentlist字段与name字段进行匹配,匹配的时候会把enrollmentlist数组字段的每个值与name进行匹配,name在enrollmentlist中的记录会被匹配到:

db.classes.aggregate( [
   {
      $lookup:
         {
            from: "members",
            localField: "enrollmentlist",
            foreignField: "name",
            as: "enrollee_info"
        }
   }
] )

聚合结果:

{
   "_id" : 1,
   "title" : "Reading is ...",
   "enrollmentlist" : [ "giraffe2", "pandabear", "artie" ],
   "days" : [ "M", "W", "F" ],
   "enrollee_info" : [
      { "_id" : 1, "name" : "artie", "joined" : ISODate("2016-05-01T00:00:00Z"), "status" : "A" },
      { "_id" : 5, "name" : "pandabear", "joined" : ISODate("2018-12-01T00:00:00Z"), "status" : "A" },
      { "_id" : 6, "name" : "giraffe2", "joined" : ISODate("2018-12-01T00:00:00Z"), "status" : "D" }
   ]
}
{
   "_id" : 2,
   "title" : "But Writing ...",
   "enrollmentlist" : [ "giraffe1", "artie" ],
   "days" : [ "T", "F" ],
   "enrollee_info" : [
      { "_id" : 1, "name" : "artie", "joined" : ISODate("2016-05-01T00:00:00Z"), "status" : "A" },
      { "_id" : 3, "name" : "giraffe1", "joined" : ISODate("2017-10-01T00:00:00Z"), "status" : "A" }
   ]
}

$lookup与$mergeObjects结合使用,合并联查后的数组

$mergeObjects可以把多个文档合并到一个文档。在$lookup后,可以增加个$mergeObjects阶段,可以把连接后的文档与输入文档合并。
创建order集合并插入两条数据:

db.orders.insertMany( [
   { "_id" : 1, "item" : "almonds", "price" : 12, "quantity" : 2 },
   { "_id" : 2, "item" : "pecans", "price" : 20, "quantity" : 1 }
] )

创建items集合并插入几条数据

db.items.insertMany( [
  { "_id" : 1, "item" : "almonds", description: "almond clusters", "instock" : 120 },
  { "_id" : 2, "item" : "bread", description: "raisin and nut bread", "instock" : 80 },
  { "_id" : 3, "item" : "pecans", description: "candied pecans", "instock" : 60 }
] )

下面的操作首先在$lookup阶段通过两个集合的item字段进行连接,然后在$replaceRoot阶段使用$mergeObjects合并items和orders集合的文档。

db.orders.aggregate( [
   {
      $lookup: {
         from: "items",
         localField: "item",    // orders集合的item字段
         foreignField: "item",  // items集合的item字段
         as: "fromItems"
      }
   },
   {
      $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$fromItems", 0 ] }, "$$ROOT" ] } }
   },
   { $project: { fromItems: 0 } }
] )

聚合后的结果:

{
  _id: 1,
  item: 'almonds',
  description: 'almond clusters',
  instock: 120,
  price: 12,
  quantity: 2
},
{
  _id: 2,
  item: 'pecans',
  description: 'candied pecans',
  instock: 60,
  price: 20,
  quantity: 1
}

执行多重连接和相关子查询

管道可在连接集合上执行,并包含多个连接条件。连接条件可以引用输入集合中的字段,也可以引用外连集合中的字段。这样就可以在两个集合之间进行相关子查询。举例:
创建orders集合,并添加记录:

db.orders.insertMany( [
  { "_id" : 1, "item" : "almonds", "price" : 12, "ordered" : 2 },
  { "_id" : 2, "item" : "pecans", "price" : 20, "ordered" : 1 },
  { "_id" : 3, "item" : "cookies", "price" : 10, "ordered" : 60 }
] )

创建warehouses集合并添加记录:

db.warehouses.insertMany( [
  { "_id" : 1, "stock_item" : "almonds", warehouse: "A", "instock" : 120 },
  { "_id" : 2, "stock_item" : "pecans", warehouse: "A", "instock" : 80 },
  { "_id" : 3, "stock_item" : "almonds", warehouse: "B", "instock" : 60 },
  { "_id" : 4, "stock_item" : "cookies", warehouse: "B", "instock" : 40 },
  { "_id" : 5, "stock_item" : "cookies", warehouse: "A", "instock" : 80 }
] )

在 orders.item 和 warehouse.stock_item 字段上使用关联子查询。确保库存项目数量能满足订购数量。

db.orders.aggregate( [
   {
      $lookup:
         {
           from: "warehouses",
           let: { order_item: "$item", order_qty: "$ordered" },
           pipeline: [
              { $match:
                 { $expr:
                    { $and:
                       [
                         { $eq: [ "$stock_item",  "$$order_item" ] },
                         { $gte: [ "$instock", "$$order_qty" ] }
                       ]
                    }
                 }
              },
              { $project: { stock_item: 0, _id: 0 } }
           ],
           as: "stockdata"
         }
    }
] )

聚合后的结果:

{
  _id: 1,
  item: 'almonds',
  price: 12,
  ordered: 2,
  stockdata: [
    { warehouse: 'A', instock: 120 },
    { warehouse: 'B', instock: 60 }
  ]
},
{
  _id: 2,
  item: 'pecans',
  price: 20,
  ordered: 1,
  stockdata: [ { warehouse: 'A', instock: 80 } ]
},
{
  _id: 3,
  item: 'cookies',
  price: 10,
  ordered: 60,
  stockdata: [ { warehouse: 'A', instock: 80 } ]
}

等价的SQL语句

SELECT *, stockdata
FROM orders
WHERE stockdata IN (
   SELECT warehouse, instock
   FROM warehouses
   WHERE stock_item = orders.item
   AND instock >= orders.ordered
);

执行不相关子查询

聚合管道$lookup阶段可以在连接的集合上执行管道,它允许非相关子查询。非相关子查询不引用连接的文档字段。
创建absences集合并添加文档

db.absences.insertMany( [
   { "_id" : 1, "student" : "Ann Aardvark", sickdays: [ new Date ("2018-05-01"),new Date ("2018-08-23") ] },
   { "_id" : 2, "student" : "Zoe Zebra", sickdays: [ new Date ("2018-02-01"),new Date ("2018-05-23") ] },
] )

创建holidays集合并添加文档

db.holidays.insertMany( [
 { "_id" : 1, year: 2018, name: "New Years", date: new Date("2018-01-01") },
 { "_id" : 2, year: 2018, name: "Pi Day", date: new Date("2018-03-14") },
 { "_id" : 3, year: 2018, name: "Ice Cream Day", date: new Date("2018-07-15") },
 { "_id" : 4, year: 2017, name: "New Years", date: new Date("2017-01-01") },
 { "_id" : 5, year: 2017, name: "Ice Cream Day", date: new Date("2017-07-16") }
] )

将absences集合与holidays集合中的 2018 年假期信息连接起来:

db.absences.aggregate( [
   {
      $lookup:
         {
           from: "holidays",
           pipeline: [
              { $match: { year: 2018 } },
              { $project: { _id: 0, date: { name: "$name", date: "$date" } } },
              { $replaceRoot: { newRoot: "$date" } }
           ],
           as: "holidays"
         }
    }
] )

聚合结果:

{
  _id: 1,
  student: 'Ann Aardvark',
  sickdays: [
    ISODate("2018-05-01T00:00:00.000Z"),
    ISODate("2018-08-23T00:00:00.000Z")
  ],
  holidays: [
    { name: 'New Years', date: ISODate("2018-01-01T00:00:00.000Z") },
    { name: 'Pi Day', date: ISODate("2018-03-14T00:00:00.000Z") },
    { name: 'Ice Cream Day', date: ISODate("2018-07-15T00:00:00.000Z")
    }
  ]
},
{
  _id: 2,
  student: 'Zoe Zebra',
  sickdays: [
    ISODate("2018-02-01T00:00:00.000Z"),
    ISODate("2018-05-23T00:00:00.000Z")
  ],
  holidays: [
    { name: 'New Years', date: ISODate("2018-01-01T00:00:00.000Z") },
    { name: 'Pi Day', date: ISODate("2018-03-14T00:00:00.000Z") },
    { name: 'Ice Cream Day', date: ISODate("2018-07-15T00:00:00.000Z")
    }
  ]
}

等价的SQL:

SELECT *, holidays
FROM absences
WHERE holidays IN (
   SELECT name, date
   FROM holidays
   WHERE year = 2018
);

执行简明关联子查询

从 MongoDB 5.0 开始,$lookup支持简明关联子查询语法,改进了集合间的连接。新的简洁语法不再要求在$match阶段的$expr操作符中对外部字段和本地字段进行相等匹配。举例说明:
创建restaurants集合并添加记录

db.restaurants.insertMany( [
   {
      _id: 1,
      name: "American Steak House",
      food: [ "filet", "sirloin" ],
      beverages: [ "beer", "wine" ]
   },
   {
      _id: 2,
      name: "Honest John Pizza",
      food: [ "cheese pizza", "pepperoni pizza" ],
      beverages: [ "soda" ]
   }
] )

创建orders集合并添加记录

db.orders.insertMany( [
   {
      _id: 1,
      item: "filet",
      restaurant_name: "American Steak House"
   },
   {
      _id: 2,
      item: "cheese pizza",
      restaurant_name: "Honest John Pizza",
      drink: "lemonade"
   },
   {
      _id: 3,
      item: "cheese pizza",
      restaurant_name: "Honest John Pizza",
      drink: "soda"
   }
] )

下面的聚合在执行pipeline前,会先通过orders.restaurant_name和orders和restaurants进行匹配,然后再分别使用$$orders_drink和$beverages 访问的orders.drink和restaurants.beverages字段,并在他们之间执行$in数组匹配。

db.orders.aggregate( [
   {
      $lookup: {
         from: "restaurants",
         localField: "restaurant_name",
         foreignField: "name",
         let: { orders_drink: "$drink" },
         pipeline: [ {
            $match: {
               $expr: { $in: [ "$$orders_drink", "$beverages" ] }
            }
         } ],
         as: "matches"
      }
   }
] )

orders.drink和restaurants.drink字段中的"soda"值匹配。输出显示了匹配数组,并包含restaurants集合中所有已加入的匹配字段,执行的结果如下:

{
   "_id" : 1, "item" : "filet",
   "restaurant_name" : "American Steak House",
   "matches" : [ ]
}
{
   "_id" : 2, "item" : "cheese pizza",
   "restaurant_name" : "Honest John Pizza",
   "drink" : "lemonade",
   "matches" : [ ]
}
{
   "_id" : 3, "item" : "cheese pizza",
   "restaurant_name" : "Honest John Pizza",
   "drink" : "soda",
   "matches" : [ {
      "_id" : 2, "name" : "Honest John Pizza",
      "food" : [ "cheese pizza", "pepperoni pizza" ],
      "beverages" : [ "soda" ]
   } ]
}
MongoDB中的聚合(aggregate)查询($lookup、$unwind、$match、$project、$skip、$limit以及$sort操作符的使用) 文章目录一。概念二。集合示例准备三。各个操作符的用法1.$lookup2.$match3.$unwind4.$project5.$limit6.$skip7.$group8.$sort 一。概念 管道的概念 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。 MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。 聚合框架 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算 阅读详情

相关推荐

MongoDB聚合管道 $lookup 与$mergeObjects配合使用 以及使用let,pipeline自定义参数进行指定多个连接条件

MongoDB聚合管道 $lookup 与$mergeObjects配合使用 以及使用let,pipeline自定义参数进行指定多个连接条件

qq_32492415的博客 1786

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

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

小志的博客 4953

MongoDB聚合查询实战:从$lookup到$sort的完整数据处理流程

本文详细介绍了MongoDB聚合查询的完整流程,重点解析了$lookup、$unwind和$match等核心操作符的使用方法。通过学校管理系统的实战案例,展示了如何高效处理多表关联、数据统计和结果排序,帮助开发者掌握MongoDB复杂数据分析技巧。

weixin_29266679的博客 431

MongoDB 聚合提速 3 招:$lookup 管道、部分索引、时间序列集合(含可复现实验与 explain 统计)

本文聚焦 MongoDB 聚合提速三招:$lookup 管道版先过滤再关联、部分索引缩小扫描面、时间序列集合加速指标查询。文中给出可复现实验数据与脚本、aggStats 一键 explain 统计、索引命中速查表,并提供 优快云 资源包方便一键复现与前后对比,帮你把“慢聚合”变“稳快聚合”。

m0_61428275的博客 1364

MongoDB聚合操作MongoDB常用聚合管道聚合$project$match$count$group$unwind$limit$skip$sort$lookup用法及操作案例

目录 1.聚合操作 1.1 单一作用聚合 1.2 聚合管道 什么是 MongoDB 聚合框架 管道(Pipeline)和阶段(Stage) 常用的管道聚合阶段 $project $match $count $group $unwind $limit $skip $sort $lookup 聚合操作案例1 聚合操作案例2 1.3 MapReduce 1.聚合操作 聚合操作处理数据记录并返回计算结果。聚合操作组值来自多个文档,可以对分组数据执行各种操作以返回单个结果。

qq_34930344的博客 6012

[MongoDB小技巧24]MongoDB $lookup 聚合阶段深度解析:从入门到实战

在关系型数据库中,JOIN是再常见不过的操作。而在 MongoDB 这个文档型数据库里,跨集合关联查询的“主角”就是 $lookup。$lookup是 MongoDB 聚合管道中的一个核心阶段,用于对同一数据库中的集合执行,将外部集合中的匹配文档以数组形式添加到每个输入文档中。

分享工作中解决的问题,希望能帮到你 450

MongoDB聚合查询实战:用$lookup和$unwind搞定多表联查与数组展开(附完整代码示例)

本文通过一个完整的学生-班级-课程数据模型案例,详细解析了MongoDB聚合查询中$lookup和$unwind操作符的组合使用。文章深入探讨了如何利用$lookup实现多表联查,并结合$unwind展开数组字段,以解决一对多关联查询等复杂业务场景,并提供了完整的代码示例和性能优化建议。

weixin_30923011的博客 711

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

MongoDB的$lookup聚合阶段实现跨集合关联查询,类似SQL的JOIN但以文档嵌套形式输出。其核心特性包括:支持数组字段自动展开多值匹配,非破坏性操作保留原文档结构,结果始终以数组形式返回。典型语法包含from、localField、foreignField和as四个参数,适用于银行账户关联汇率、电商订单关联商品等场景。当需要1:1匹配时,可配合$unwind展开数组字段。$lookup严格校验字段存在性,未匹配时返回空数组,是MongoDB实现复杂数据关联的关键功能。

Wang的专栏 1093

面试复习题--RN面试

考察点:热更新方案的深度理解,选型能力,实战落地经验。答题思路主流热更新方案对比。

hqiangtai的博客 728

Pwntools不只是PWN:用它写个自动化Fuzz脚本,挖掘Linux命令行工具漏洞

本文探讨了如何利用Pwntools构建自动化Fuzz脚本,挖掘Linux命令行工具中的漏洞。通过详细的代码示例和实战案例,展示了Pwntools在Fuzzing中的高效性和灵活性,特别适合快速验证特定场景的安全问题。文章还提供了进阶技巧和避坑指南,帮助安全研究人员快速上手并提升测试效率。

weixin_28718345的博客 221

MongoDB高级聚合实战:$unwind、$lookup、$bucket与$facet详解

数据处理是现代应用开发的核心环节,面对嵌套数组、多表关联和海量统计需求,传统逐条查询的方式往往效率低下。聚合管道作为一种数据处理流水线,通过分阶段处理文档流,能在数据库端一次性完成复杂的数据加工。其中,数组平铺、表关联、分桶统计和多维并行分析是解决实际业务问题的关键技术。了解管道的执行模型和阶段顺序优化,有助于构建高性能的数据处理方案。从电商订单分析到实时报表生成,聚合管道都能有效减少应用层与数据库的交互开销。MongoDB聚合框架借助$unwind实现数组展开,通过$lookup完成集合关联,结合$buc

weixin_30768881的博客 262

RPA实战-UiPath自动化处理Outlook邮件附件全流程解析

本文详细解析了如何使用UiPath实现Outlook邮件附件的自动化处理全流程,涵盖环境配置、核心流程实现、高级功能扩展及性能优化技巧。通过RPA技术,企业可大幅提升邮件附件处理效率,减少人工操作错误,适用于财务、物流等多个场景。

weixin_33701251的博客 429

MongoDB聚合管道性能优化:从$match顺序到$lookup避坑实战

聚合管道是MongoDB中实现高效数据处理的核心机制,其本质是一种显式数据流编程模型,通过分阶段操作(如过滤、投影、分组、关联)对文档进行逐层转换。理解各阶段的执行顺序与内存行为,尤其是$match的索引触发能力、$project的字段精简价值、$lookup的pipeline内过滤技巧,直接决定查询性能与系统稳定性。在电商、物联网、金融等高并发场景下,错误的阶段编排会导致内存暴涨、响应延迟甚至集群雪崩。本文聚焦真实工程痛点,解析如何用基础操作符构建可维护、可监控、可扩展的数据蒸馏流水线。

weixin_30420305的博客 365

极坐标格式算法(PFA)-SAR成像算法系列(六)

SAR成像算法:极坐标格式算法,介绍了算法的基本原理以及实现步骤,包含dechirp处理、RVP补偿,距离插值、方位插值。文后附有代码,可根据自身情况下载。

yjh_2019的博客 1万+

Google 人机验证(reCaptcha)无法显示解决方案

Google 人机验证无法显示解决方案第一步 安装插件Chrome/Edge 电脑版Firefox 电脑版第二步 配置插件原理参考文章 前言:为了防止机器人攻击,国外很多网站都使用了 Google reCaptcha 验证码。reCaptcha 对于国外用户非常的友好,但是… 对于国内用户就不怎么友好了。究其原因,则是国内网络全线屏蔽 Google 服务,导致 reCaptcha 完全加载不出来。这样,国内玩家就无法在对应的网站进行下一步操作了。本方案可以解决 reCaptcha 无法加载的问题。 适用

qq_40713201的博客 8万+

MongoDB聚合查询实战:用$lookup和$unwind搞定多表联查(附学生管理系统案例)

本文通过一个学生管理系统案例,详细解析了MongoDB聚合查询中$lookup和$unwind操作符的实战应用。文章演示了如何通过三步构建多表联查,将学生、班级与课程信息高效关联,并分享了包括索引优化、管道顺序在内的关键性能调优技巧,帮助开发者掌握MongoDB处理复杂数据关联的核心方法。

e3f4g5的博客 687

YOLOv5/v7/v8/v9/v10/v11/v12/13目标检测结果解析,超w字精读,IoU、GIoU、DIoU、CIoU、EIoU详细解释,精确率、召回率、AP、mAP与P-R 曲线图深度解析

YOLOv5/v7/v8/v9/v10/v11/v12/13目标检测结果解析,超w字精读,IoU、GIoU、DIoU、CIoU、EIoU详细解释,精确率、召回率、AP、mAP与P-R 曲线图深度解析

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1413

MongoDB聚合框架深度揭秘:90%开发者忽略的$lookup性能优化细节

掌握MongoDB聚合查询性能瓶颈的破解之道,深入解析$lookup关联优化技巧。涵盖多表关联、索引使用与管道优化等实战要点,显著提升查询效率。90%开发者忽略的关键细节,值得收藏。

BytePulse的博客 384

【文献笔记】CVPR 2023|Attention-Based Point Cloud Edge Sampling

优点能够有效采出点云数据的边缘点分类任务性能优越不足没有设计出一个更好的上采样方法,导致分割任务的性能略低只考虑了边缘特征,没有利用其他几何特征。

m0_55908255的博客 320

图像增强算法:基于Retinex的图像增强算法

该算法对图像的亮度和颜色进行分离处理,然后通过调整它们的比例来提高图像的质量。滤波后的图像将保留颜色信息,并减少图像中的噪声。接下来,Retinex算法使用一个高通滤波器对原始图像进行滤波处理,以增强图像中的亮度信息。通过使用Retinex增强算法,我们可以有效地提高图像的质量,增强图像中的细节和颜色信息。最后,Retinex算法通过将颜色恢复和亮度调整后的图像进行比例调整,以获得最终的增强图像。Retinex算法是一种常用的图像增强算法,它通过对图像的亮度和颜色进行调整,以提高图像的视觉质量。

XsiJava的博客 436

mongodb $lookup 之后再$project_实记 | MongoDB 多表连接查询

小小这次进行实记,这次是关于MongoDB的多表连接查询,使用此连接查询,实现MySql中的order与having等方法。MongoDB 多表关联查询这里使用的是MongoDB的多表关联查询。聚合框架聚合框架是MongoDB的高级查询语言,允许我们通过转换和合并多个文档中的数据,用于相关的指定。命令功能描述$project指定输出文档的字段$lookup进行多表关联在本篇中,将会着重的...

weixin_39748838的博客 613

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MongoDB聚合管道实战:用$lookup、$unwind、$match、$project完成多表关联查询(TaoToken统一Key通道)

MongoDB聚合管道实战:用$match过滤已支付订单、$unwind拆解items数组、$lookup关联users与products集合、$project裁剪字段,附可复制JSON配置与mongosh验证步骤。通过TaoToken统一Key通道管理调用凭证,官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 提供完整接入方案。

weixin_33531560的博客 190

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MongoDB聚合操作分享-上

本文介绍了MongoDB 4.4版本中的两种聚合操作:聚合管道(Aggregation Pipeline)和Map-Reduce。重点讲解了聚合管道的使用,包括$match、$group、$count、$sort、$unwind和$project等常用阶段的操作语法和示例。其中$match用于文档过滤,$group实现分组统计,$unwind展开数组字段,$project控制输出字段。通过多个示例演示了如何组合不同阶段构建聚合管道,以实现复杂的数据处理和分析需求。

热爱技术、喜欢学习、乐于分享 811

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MongoDB多表关联查询实战:MongoTemplate的$lookup、DBRef与内存组装方案

文档型数据库以聚合根方式存储数据,天然不鼓励跨集合JOIN操作。其核心原理是通过内嵌文档保证单次查询的完整性,但面对引用频繁、数据量差异大或历史遗留系统时,跨集合关联仍不可避免。在Spring Data MongoDB中,MongoTemplate提供了$lookup聚合管道、DBRef引用和手动两次查询等关联手段,各自在性能与复杂度上存在明显权衡。合理运用这些方案,可在订单、用户、商品等典型业务场景中实现高效数据组装,避免N+1查询与分页陷阱。

weixin_34416754的博客 348

MongoDB多表关联查询实战:MongoTemplate手动拼装与$lookup方案对比

文档型数据库以数据局部性为核心设计原则,通过内嵌文档或引用字段来组织关联数据,而非依赖外键与JOIN。其底层原理在于将经常一起访问的数据存储在同一个文档中,从而减少跨集合查询开销。在Java生态中,MongoTemplate提供了聚合管道与批量查询能力,使开发者能够灵活实现关联数据的拼装与映射。合理运用手动引用加应用层拼装,配合索引优化与缓存策略,可显著提升查询性能并降低数据库负载。该方案广泛应用于订单与用户信息关联、商品与分类映射等读多写少的业务场景。本文围绕MongoTemplate,深入拆解多表关联查

weixin_34357436的博客 352
上一篇: MicroPython ESP32 ADC电压测量问题
下一篇: MicroPython远程控制工具:mpremote
原子星
博客等级 码龄20年 3425粉丝 310原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

原子星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值