这一篇接着记录一下查询相关的操作。想象一下,如果想要在一张表格中展示某些车辆的耗损和营收情况,我们该怎么处理。车辆、耗损、营收各自存储在一张表中,耗损和营收中冗余了车辆信息……我们便想到了关联查询。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)的结构……因为所有的数据都放在同一张表中,之前我们处理过这张表,现在还要处理一遍,不太情愿 |
|