Mongodb使用视图连接两个集合

您可以使用 $lookup 为两个集合创建一个视图,然后对该视图运行查询。应用程序可以查询视图,而无需构建或维护复杂的管道。

例子

创建两个样本集合 inventory 和 orders

db.inventory.insertMany( [{ prodId: 100, price: 20, quantity: 125 },{ prodId: 101, price: 10, quantity: 234 },{ prodId: 102, price: 15, quantity: 432 },{ prodId: 103, price: 17, quantity: 320 }
] )db.orders.insertMany( [{ 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 }
] )

创建连接视图

此命令使用 db.createView() 基于 orders 集合创建名为 sales 的新视图:

db.createView( "sales", "orders", [{$lookup:{from: "inventory",localField: "prodId",foreignField: "prodId",as: "inventoryDocs"}},{$project:{_id: 0,prodId: 1,orderId: 1,numPurchased: 1,price: "$inventoryDocs.price"}},{ $unwind: "$price" }
] )

在示例中:

  • $lookup 阶段使用 orders 集合中的 prodId 字段来“连接” inventory 集合中具有匹配 prodId 字段的文档。

  • 匹配的文档将作为数组添加到 inventoryDocs 字段中。

  • $project 阶段选择可用字段的子集。

  • $unwind 阶段会将 price 字段从数组转换为标量值。

sales 视图中的文档包括:

{ orderId: 201, prodId: 100, numPurchased: 20, price: 20 },
{ orderId: 202, prodId: 101, numPurchased: 10, price: 10 },
{ orderId: 203, prodId: 102, numPurchased: 5, price: 15 },
{ orderId: 204, prodId: 103, numPurchased: 15, price: 17 },
{ orderId: 205, prodId: 103, numPurchased: 20, price: 17 },
{ orderId: 206, prodId: 102, numPurchased: 1, price: 15 },
{ orderId: 207, prodId: 101, numPurchased: 5, price: 10 },
{ orderId: 208, prodId: 100, numPurchased: 10, price: 20 },
{ orderId: 209, prodId: 103, numPurchased: 30, price: 17 }

 查询视图

要查找每种产品的总销售量,请查询视图:

db.sales.aggregate( [{$group:{_id: "$prodId",amountSold: { $sum: { $multiply: [ "$price", "$numPurchased" ] } }}}
] )

输出见下:

[{ _id: 102, amountSold: 90 },{ _id: 101, amountSold: 150 },{ _id: 103, amountSold: 1105 },{ _id: 100, amountSold: 600 }
]

使用视图连接两个集合 — MongoDB 手册 v6.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460595.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.2 大数据概念、特征与价值

文章目录 大数据的概念美国高德纳咨询公司的定义麦肯锡全球研究所的定义狭义和广义的大数据 大数据的特征Volume(体积)Variety(种类)Velocity(速度)Value(价值)Veracity(…

扫雷游戏(C语言详解)

扫雷游戏(C语言详解) 放在最前面的1、前言(扫雷游戏的简介)2、扫雷游戏的规则(简易版)3、代码实现(3.1)提醒一下:( i ) 提醒1:( ii ) 提醒2: &…

WPF+MVVM案例实战(十四)- 封装一个自定义消息弹窗控件(下)

文章目录 1、案例效果2、弹窗空间使用1.引入用户控件2、按钮命令实现 3、总结4、源代码获取 1、案例效果 2、弹窗空间使用 1.引入用户控件 打开 Wpf_Examples 项目,在引用中添加用户控件库,在 MainWindow.xaml 界面引用控件库,代码如下&…

银河麒麟v10 xrdp安装

为了解决科技被卡脖子的问题,国家正在大力推进软硬件系统的信创替代,对于一些平时对Linux操作系统不太熟练的用户来讲提出了更高的挑战和要求。本文以银河麒麟v10 24.03为例带领大家配置kylin v10的远程桌面。 最近公司为了配置信创开发新购了几台银河麒…

Python小游戏17——飞机大战

运行结果 首先,你需要安装Pygame库。如果你还没有安装它,可以使用以下命令来安装: bash pip install pygame 代码: python import pygame import random # 初始化Pygame pygame.init() # 屏幕大小 SCREEN_WIDTH 800 SCREEN_HEIGH…

国标GB28181软件EasyGBS国标GB28181网页直播平台在邮政快递场景中的应用

随着电子商务的迅猛发展,邮政快递行业迎来了前所未有的发展机遇,但同时也面临着诸多挑战。如何在保障货物安全、提高运输效率的同时,实现全面的监控和管理,成为邮政快递企业亟需解决的问题。国标GB28181网页直播平台EasyGBS作为一…

MFC工控项目实例二十七添加产品参数

承接专栏《MFC工控项目实例二十六创建数据库》 在型号参数界面添加三个参数试验时间、最小值、最大值。变量为double m_edit_time; double m_edit_min; double m_edit_max; 1、在SEAL_PRESSURE.h中添加代码 class CProductPara { public:union{struct{...double m_edit_min;…

java项目之智能学习平台系统源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的智能学习平台系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…

Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记

Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记 这是新国立和新加坡管理大学发表在ECCV2024上的一篇image restoration的文章,提出了一个新的网络结构ECMA,从实验结果上看在超分,去噪,去模糊…

STEAM教育是什么?从学科融合到创造力培养的全新教育模式

近年来,“STEAM教育”成为教育界的热门词汇。随着技术和科学的发展,传统的单一学科教育已难以满足未来社会对创新型人才的需求。STEAM教育因其跨学科的特点,成为培养学生综合素质和创新能力的有效方式。那么,什么是STEAM教育&…

SystemC学习(3)— APB_SRAM的建模与测试

SystemC学习(3)— APB_SRAM的建模与测试 一、前言 二、APB_SRAM建模 编写APB_SRAM模型文件apb_sram.h文件如下所示: #ifndef __APB_SRAM_H #define __APB_SRAM_H#include "systemc.h"const int ADDR_SIZE 32; const int DATA_…

Spring Boot Configuration和AutoConfiguration加载逻辑和加载顺序调整

在spring中, AutoConfiguration也是一个种Configuration,只是AutoConfiguration是不能使用proxy的。 而且spring对于两者的加载顺序也不是一视同仁,是有顺序的。spring会先加载SpringBootApplication可达的且标注了Configuration的类&#x…

CodeS:构建用于文本到 SQL 的开源语言模型

发布于:2024 年 10 月 29 日 #RAG #Text2 SQL #NL2 SQL 语言模型在将自然语言问题转换为 SQL 查询(文本到 SQL )的任务中显示出良好的性能。然而,大多数最先进的 (SOTA) 方法都依赖于强大但闭源的大型语言…

社区交流系统设计与实现

社区交流系统设计与实现 1. 系统概述 社区交流系统是一个基于PHP和SQL的Web应用程序,旨在为用户提供一个互动交流的平台。该系统允许用户注册、发布帖子、回复帖子、查看其他用户的帖子和回复,以及管理个人资料,提高用户之间的互动和信息共享…

什么是字节序、大小端、高低字节、高低地址?

目录 1. 什么是字节序(Endianness)? 2. 什么是大小端(Big-Endians and Little-Endian)? 3. 什么时候需要用到大小端的概念? 4. 如何确认系统的大小端模式? 5. 什么是大小端定义…

为什么 C 语言数组是从 0 开始计数的?

C 语言等大多数编程语言的数组从 0 开始而不从 1 开始,有两个原因: 第一:地址计算更方便 C 语言从 0 开始的话,array[i] 的地址就正好是: (array i) 如果是从 1 开始的话,就是 (array i - 1) 多一次计…

锁升级及线程池相关

锁升级 在JVM底层实现锁的过程中,有三类锁:偏斜锁、轻量级锁、重量级锁 在Java6之前,synchronized的实现完全依靠重量级锁(系统内的互斥锁),从用户态转为内核态非常消耗资源。在Java6之后,提供…

vue3+less使用主题定制(多主题定制)可切换主题

假如要使用两套主题:蓝色、红色 例如: 首先确保自己的vue3项目有less,这边不多做接入解释 1、在src目录下建一个styles文件夹,在syles文件夹下面新建两个less文件:theme.less和variables.less; theme.le…

Java面试经典 150 题.P80. 删除有序数组中的重复项 II(004)

本题来自:力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解: class Solution {public int removeDuplicates(int[] nums)…

【QNAP威联通NAS系统恢复进阶教程】如果 .conf 和 md9 无法自动组装,如何恢复 NAS?

创作立场:原创不易,拒绝搬运~ hello大家好,我是你们的老伙伴,稳重的大王~ 从本期开始,大王将在日常教程中,分享一些QNAP系统故障的排除以及解决办法,进阶教程需要具备一定的linux基础&#xf…