MongoDB 聚合 -- 连表查询

本文介绍了如何在MongoDB中使用$lookup聚合操作符进行连表查询,以实现用户和订单数据的关联。通过实例展示了如何进行左连接、数组拆分、分组求和等操作,帮助理解MongoDB的连表查询方法。
摘要由CSDN通过智能技术生成

在使用MongoDB存储数据的时候,我们查询的时候,有时候难免会需要进行连表查询。但是MongoDB本身是非关系性数据库,连表查询,很多时候,需要我们自己在代码里手工操作。但是从 MongoDB 3.2 版本过后,我们可以使用 $lookup 进行连表查询。下面就简单介绍一下 MongoDB 的 $lookup 的简单使用。

比如现在我们有两张表, user 和 order 表。其中 user 表中的字段有 _id、uid、name、age;order 表中的字段有:_id、uid、product、money; 两张表存储的数据为:

users = [{
_id: ObjectId(“5af2b2c6b138c267e414c072”),
uid: “uid000”,
name: “小红”,
age: 26
}, {
_id: ObjectId(“5af2b2c6b138c267e414c073”),
uid: “uid001”,
name: “小芳”,
age: 27
}]

orders = [{
_id: ObjectId(“4af2b2c6b138c267e414c071”),
uid: “uid000”,
product: “产品1”,
money: 100
}, {
_id: ObjectId(“4af2b2c6b138c267e414c072”),
uid: “uid000”,
product: “产品2”,
money: 200
}, {
_id: ObjectId(“4af2b2c6b138c267e414c073”),
uid: “uid001”,
product: “产品1”,
money: 100
}, {
_id: ObjectId(“4af2b2c6b138c267e414c074”),
uid: “uid001”,
product: “产品2”,
money: 200
}]

假如现在有两个需求:

查询用户信息并且显示该用户的总消费金额(用户名、年龄、总消费金额)
查询用户的订单信息(订单id、产品、价格、用户名)
  1. 首先来看第一个需求:

这个需求如果我们不考虑连表,只考虑关联的话,应该是

先查询出用户表所有的数据
在订单表中求出每一个用户的消费总金额
遍历用户和订单数据,然后一一通过 uid 进行匹配对应。

如果按照我们的数据库连表来说:那应该是我们查询 user 表关联到 order 表,然后分组根据 uid 统计求和;下面来看一看具体的实现方式。
1.1 连表查询

db.user.aggregate([{
$lookup: { // 左连接
from: “order”, // 关联到order表
localField: “uid”, // user 表关联的字段
foreignField: “uid”, // order 表关联的字段
as: “orders”
}
}]);

这个时候出来的结果应该为:

users = [{
_id: ObjectId(“5af2b2c6b138c267e414c072”),
uid: “uid000”,
name: “小红”,
age: 26,
orders: [{
_id: ObjectId(“4af2b2c6b138c267e414c071”),
uid: “uid000”,
product: “产品1”,
money: 100
}, {
_id: ObjectId(“4af2b2c6b138c267e414c072”),
uid: “uid000”,
product: “产品2”,
money: 200
}]
}, {
_id: ObjectId(“5af2b2c6b138c267e414c073”),
uid: “uid001”,
name: “小芳”,
age: 27,
orders: [{
_id: ObjectId(“4af2b2c6b138c267e414c073”),
uid: “uid001”,
product: “产品1”,
money: 100
}, {
_id: ObjectId(“4af2b2c6b138c267e414c073”),
uid: “uid001”,
product: “产品1”,
money: 200
}]
}]
1.2 拆分 orders 数组

{
KaTeX parse error: Expected '}', got 'EOF' at end of input: …子数组 path: "orders",
preserveNullAndEmptyArrays: true // 空的数组也拆分
}
}

这个时候的数据结果应该是这样的

[{
_id: ObjectId(“5af2b2c6b138c267e414c072”),
uid: “uid000”,
name: “小红”,
age: 26,
orders: {
_id: ObjectId(“4af2b2c6b138c267e414c071”),
uid: “uid000”,
product: “产品1”,
money: 100
}
}, {
_id: ObjectId(“5af2b2c6b138c267e414c072”),
uid: “uid000”,
name: “小红”,
age: 26,
orders: {
_id: ObjectId(“4af2b2c6b138c267e414c072”),
uid: “uid000”,
product: “产品2”,
money: 200
}
} …… ]

1.3 分组求和并返回字段数据

{
KaTeX parse error: Expected '}', got 'EOF' at end of input: …分组查询 _id: "_id",
name: {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值