這一篇接著記錄一下查詢相關的操作。想象一下,如果想要在一張表格中展示某些車輛的耗損和營收情況,我們該怎麼處理。車輛、耗損、營收各自存儲在一張表中,耗損和營收中冗餘了車輛信息……我們便想到了關聯查詢。mongodb 3.2+中開始支持關聯查詢,下麵介紹一下寫關聯查詢的過程。 測試一、 結合前面筆記的成 ...
這一篇接著記錄一下查詢相關的操作。想象一下,如果想要在一張表格中展示某些車輛的耗損和營收情況,我們該怎麼處理。車輛、耗損、營收各自存儲在一張表中,耗損和營收中冗餘了車輛信息……我們便想到了關聯查詢。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)的結構……因為所有的數據都放在同一張表中,之前我們處理過這張表,現在還要處理一遍,不太情願