需求

假设有三个类型有所不同的表,saleorders、careorders、repairorders,表中有storeId信息,用于关联其所属的门店stores表,现在有个需求是要将这三个表集中展示在一个表格中展示。

实现

以下驱动使用mongoose实现,MongoDB版本大于3.6。


var orders = Store.aggregate([
{
$match: {_id: storeId},
},
{
$lookup: {
from: "saleorders",
let: {
storeId: storeId,
},
pipeline: [
{
$match: {
$expr: {
$eq: ['$storeId', '$$storeId'],
}
}
}
],
as:'sales'
}
},
{
$lookup: {
from: "careorders",
let: {
storeId: storeId
},
pipeline: [
{
$match: {
$expr: {
$eq: ['$storeId', '$$storeId']
}
}
} ],
as: 'cares'
}
},
{
$lookup: {
from: "repairorders",
let: {
storeId: storeId
},
pipeline: [
{
$match: {
$expr: {
$eq: ['$storeId', '$$storeId']
}
}
} ],
as: 'repairs'
}
},
{
$addFields: {
"repairs.orderType": '1',
"sales.orderType": '2',
"cares.orderType": '3',
}
},
{
$project: {
_id: 0,
items: {
$concatArrays: ['$repairs', '$cares', '$sales']
}
}
},
{$unwind: '$items'},
{
$replaceRoot: {
newRoot: '$items'
}
},
{$sort: {_id: -1 }},
])

这种实现的重点是使用一个排序集合之外的文档来关联这三个集合以及使用操作符$concatArrays来组合多个数组。常规的思路是,你要哪几个集合,就用那些集合进行关联,然后$unwind操作,但这种操作无法实现预期目的,因为$lookup是对每个文档进行对外关联。上述写法的思路是,假设几个集合的文档都集中在一个文档中的三个字段上,那么我们可以在单个集合上对数组合并排序。当然,前提第一步必须能找到一定会存在的唯一文档来实现关联,否则下面的步骤要不就关联不了,要不就关联多次,鉴于上面的操作是针对单个storeId的,所以必然能从stores集合中找到唯一的store文档进行关联。

当然,现实情况应该尽量避免这种方式来设计集合, 对于类型相似的文档应该放在同一个集合中,而且这种查询方式很可能出现聚合的中间步骤产生的数据量超过MongoDB限制(默认100M)的问题,应当使用allowDiskUse: true设置。

最新文章

  1. java MD5 32位加密
  2. bing的简单英文字典工具
  3. shell脚本中的几个括号总结(小括号/大括号/花括号)--from:http://www.cnblogs.com/hanyan225/archive/2011/10/06/2199652.html
  4. ExtJS4插件EditArea
  5. 苹果应用 Windows 申请 普通证书 和Push 证书 Hbuilder 个推(2)
  6. ZT 第一范式,第二范式,第三范式
  7. 【BZOJ-1797】Mincut 最小割 最大流 + Tarjan + 缩点
  8. Linux中如何查看文件的最初创建时间
  9. Spring中@Autowired注解与自动装配
  10. RESTful API -备
  11. NSURLConnection获取数据
  12. HTML学习笔记 基础表格案例 第二节 (原创) 参考使用表
  13. nginx新的站点的配置
  14. python selenium-webdriver 元素操作之键盘操作(五)
  15. Python模块之time、datetime
  16. ABP实践学习
  17. IDEA下使用Maven的test命令乱码
  18. jdk settings
  19. linux 终端输出颜色
  20. leetcode 136 Single Number, 260 Single Number III

热门文章

  1. 在 C/C++ 中使用 TensorFlow 预训练好的模型—— 直接调用 C++ 接口实现
  2. 相关系数之杰卡德相似系数(Jaccardsimilarity coefficient)
  3. svn建立主干和分支在分支上开发然后合并到主干
  4. iOS-数据持久化之Sqllite
  5. 【bzoj2453】维护队列/【bzoj2120】数颜色 分块+二分
  6. 一道js的前端面试题,主要弄清楚逗号表达式的作用
  7. 51nod 1680区间求和 (dp+树状数组/线段树)
  8. 【题解】洛谷P2418 yyy loves OI IV
  9. SCU3037 Painting the Balls
  10. final变量属性小记