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

GE Proficy Historian8.0历史数据库部署与配置全攻略

本文提供了GE Proficy Historian 8.0历史数据库的详细部署与配置指南。内容涵盖安装前的系统环境、权限与依赖检查,服务器安装的关键步骤与类型选择,采集器的安装配置与数据接入,以及客户端工具的使用与数据分析实战。旨在帮助用户规避常见陷阱,实现一次部署成功,构建稳定高效的工业数据归档平台。

silver的专栏 768

Win11右键菜单显示更多选项设置默认展开方法

在Windows 11操作系统中,用户可能会发现右键点击桌面空白处时,弹出的菜单中仅显示“显示更多选项”,而并非直接展示所有可用的选项。这对于希望快速访问特定功能的用户来说,无疑增加了一些不便。为了优化这一体验,本文将介绍两种简单的方法,帮助用户设置Win11右键菜单,使其默认展开包含的所有选项。通过上述两种方法,用户可以轻松地将Win11右键菜单设置为默认展开所有选项,从而提高工作效率和便捷性。希望这篇文章对你有所帮助!

nntxthml的博客 1万+

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

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

weixin_30768881的博客 262

Adobe Acrobat Pro(Adobe PDF) - 使用技巧

Adobe Acrobat Pro为Adobe出品的PDF查看和编辑软件,下文简称Adobe PDF,该软件功能强大,拥有查看PDF、编辑PDF、打印PDF、导出PDF、合并文件、组织页面、文本标注、注释、动作向导、等功能。本文介绍Adobe PDF的一些使用技巧,最后介绍软件设置。

NSJim的博客 4万+

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

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

weixin_30420305的博客 365

压电传感器信号放大难题?用运放设计电荷放大器的5个关键步骤

本文详细解析了压电传感器信号放大难题,并提供了用运放设计电荷放大器的5个关键步骤。从电压放大到电荷放大的范式转换,到运放选型、反馈网络设计、PCB布局及频响特性验证,帮助工程师解决工业自动化中的信号衰减问题,提升测量精度和稳定性。

weixin_27303545的博客 449

手把手教你用Proteus仿真51单片机抢答器:倒计时+蜂鸣器报警完整项目

本文详细介绍了使用Proteus软件仿真51单片机智能抢答器的完整项目流程。通过系统架构设计、核心元件选型(如74LS30用于按键中断编码),结合状态机编程,实现了带可调倒计时、数码管显示和蜂鸣器报警的八路抢答器功能。项目涵盖了从原理图绘制到代码调试的全过程,是学习嵌入式系统开发的绝佳实践。

tcp8optimizer的博客 263

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

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

e3f4g5的博客 687

13、深入理解 Microsoft 365 的安全与合规概念

本文深入探讨了 Microsoft 365 的安全与合规概念,涵盖文档存储、文件共享、审计、保留、eDiscovery、分类和保护以及网络等多个关键方面。通过合理配置这些功能,组织可以更好地管理和保护其数据资源,满足法规要求,并提升工作效率。文章还提供了最佳实践建议及流程图,帮助读者全面理解 Microsoft 365 的安全架构和管理策略。

k8s6orchestrator的博客 212

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

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

BytePulse的博客 384

RT-DETR 模型剪枝优化:结构化剪枝对 R18/R50 性能的影响

本文提出分层结构化剪枝策略R18:参数量减少 42%(28M→16.2M),推理速度提升 35%(15→20.3 FPS@Jetson Nano),mAP@0.5 仅降 1.2%;R50:参数量减少 55%(170M→76.5M),推理速度提升 48%(42→62.2 FPS@T4),mAP@0.5 仅降 2.1%。核心价值:为 RT-DETR 提供“精度-效率-部署”平衡的轻量化方案,推动其在边缘设备、工业质检等场景的大规模落地。部署建议。

走向CTO的路上... 464

【YOLOv8科研级优化】基于YOLOv9的GELAN模块重构C2f结构,实现精度与效率的同步提升

打开确保模型解析器能识别GELANBlock模块。通过将YOLOv9的GELAN模块集成到YOLOv8的C2f模块中,我们实现了一个“强特征表达+高效计算”的目标检测模型。这个改进不仅在工程上能提升复杂场景下的检测效果,更在科研上提供了“多分支特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的改进中,帮你在论文中打造独特的研究点。

know_F0727的博客 203

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

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

weixin_39748838的博客 613

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

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

MongoDB聚合操作分享-上

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

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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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、付费专栏及课程。

余额充值