这一篇接着记录一下查询相关的操作。想象一下,如果想要在一张表格中展示某些车辆的耗损和营收情况,我们该怎么处理。车辆、耗损、营收各自存储在一张表中,耗损和营收中冗余了车辆信息……我们便想到了关联查询。mongodb 3.2+中开始支持关联查询,下面介绍一下写关联查询的过程。

  测试一、

db.getCollection('FormInstace').aggregate([
{
$match: {
"FormItems.key": { $ne: null }
}
},
{
$addFields: {
FormValueObj: {
$arrayToObject: {
$map: {
input: "$FormItems",
as: "field",
in: [ "$$field.key", "$$field.value" ]
}
}
}
}
},
{
$replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
},
{
$project: {
FormItems:0,
FormValueObj:0
}
},
{
$lookup:{
from:"FormInstace",
localField:'_id',
foreignField:'FormItems.value.id',
as:'RelationData'
}
}
]);

  结合前面笔记的成果和官方文档写了第一个关联查询,这次查询跑了300s直接累死了,于是我便介绍了一下数量。

  测试二、

db.getCollection('FormInstace').aggregate([
{
$match: {
"_id":{$in:["1","2","3"]},
"FormItems.key": { $ne: null }
}
},
{
$addFields: {
FormValueObj: {
$arrayToObject: {
$map: {
input: "$FormItems",
as: "field",
in: [ "$$field.key", "$$field.value" ]
}
}
}
}
},
{
$replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
},
{
$project: {
FormItems:0,
FormValueObj:0
}
},
{
$lookup:{
from:"FormInstace",
localField:'_id',
foreignField:'FormItems.value.id',
as:'RelationData'
}
}
]);

  这次总算没有报错,但是耗时也够长的(十多秒);关联数据(RelationData)确实是查出来了,但是该数组中的关联数据还是原来的数据结构。那么我们是不是同样可以将关联数据中的表单项的值也放到最外层,答案是可以的。

  测试三、

db.getCollection('FormInstace').aggregate([
{
$match: {
"_id":{$in:["1","2","3"]},
"FormItems.key": { $ne: null }
}
},
{
$addFields: {
FormValueObj: {
$arrayToObject: {
$map: {
input: "$FormItems",
as: "field",
in: [ "$$field.key", "$$field.value" ]
}
}
}
}
},
{
$replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
},
{
$project: {
FormItems:0,
FormValueObj:0
}
},
{
$lookup:{
from:"FormInstace",
localField:'_id',
foreignField:'FormItems.value.id',
as:'RelationData'
}
},
{
$addFields:{
RelationData:{
$map:
{
input: "$RelationData",
as: "tr",
in: {
$arrayToObject:{
$map:
{
input:{
$concatArrays: [
[
{key:"_id",value:"$$tr._id"},
{key:"ExtendData",value:"$$tr.ExtendData"},
{key:"CreateUserId",value:"$$tr.CreateUserId"},
{key:"CreateUserName",value:"$$tr.CreateUserName"},
{key:"CreateDate",value:"$$tr.CreateDate"},
{key:"LastModifyDate",value:"$$tr.LastModifyDate"},
{key:"FormId",value:"$$tr.FormId"},
{key:"FormVersion",value:"$$tr.FormVersion"},
],
"$$tr.FormItems" ]
},
as: "field",
in: ["$$field.key","$$field.value"]
}
}
}
}
}
}
}
]);

  这个查询得到了我们想要的效果,但是这个关联查询太费劲了,不单是代码一大推,并且还要处理关联数据(RelationData)的结构……因为所有的数据都放在同一张表中,之前我们处理过这张表,现在还要处理一遍,不太情愿

最新文章

  1. 关于jquery 集合对象的 each和click方法的 思考 -$(this)的认识
  2. freemarker页面如何获取绝对路径basePath
  3. JavaScript学习笔记-实例详解-类(一)
  4. BestCoder27 1002.Taking Bus(hdu 5163) 解题报告
  5. hdu1240 bfs 水题
  6. 使用友盟进行apk的自动更新
  7. 基于HDInsight 3.4 HBase集群规划参考
  8. USACO全部测试数据
  9. UVA11401Triangle Counting(简单计数)
  10. 用 for/in 在 Java 5.0 中增强循环
  11. trie tree(字典树)
  12. WimMaker 2.0 (2013.10) WIM制作工具
  13. Java基础——深入理解Java中的final关键字(转载)
  14. Redis主从实战
  15. bypy 用法
  16. python全栈开发day29-网络编程之socket常见方法,socketserver模块,ftp作业
  17. 【Spark 深入学习-08】说说Spark分区原理及优化方法
  18. html5-textarea元素
  19. Cache专用: SoftReference
  20. C#学习笔记(32)——委托改变窗体颜色

热门文章

  1. POJ1704 Georgia and Bob(Nim博弈变形)
  2. 2019 湖南多校第一场(2018~2019NCPC) 题解
  3. CodeForces-508A~D篇 div.2
  4. 这个Python爬虫的简单入门及实用的实例,你会吗?
  5. 【UIBE】研究生考试前必看
  6. 将数据库中数据导出为excel表格
  7. 【CHRIS RICHARDSON 微服务系列】微服务架构中的进程间通信-3
  8. AQS系列(六)- Semaphore的使用及原理
  9. JUC-7-lock接口
  10. 物联网基础组件IoTClient开发系列