|
這一篇接著記錄一下查詢相關(guān)的操作。想象一下,如果想要在一張表格中展示某些車輛的耗損和營收情況,我們該怎么處理。車輛、耗損、營收各自存儲在一張表中,耗損和營收中冗余了車輛信息……我們便想到了關(guān)聯(lián)查詢。mongodb 3.2+中開始支持關(guān)聯(lián)查詢,下面介紹一下寫關(guān)聯(lián)查詢的過程。 測試一、 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'
}
}
]);
結(jié)合前面筆記的成果和官方文檔寫了第一個關(guān)聯(lián)查詢,這次查詢跑了300s直接累死了,于是我便介紹了一下數(shù)量。 測試二、 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'
}
}
]);
這次總算沒有報錯,但是耗時也夠長的(十多秒);關(guān)聯(lián)數(shù)據(jù)(RelationData)確實是查出來了,但是該數(shù)組中的關(guān)聯(lián)數(shù)據(jù)還是原來的數(shù)據(jù)結(jié)構(gòu)。那么我們是不是同樣可以將關(guān)聯(lián)數(shù)據(jù)中的表單項的值也放到最外層,答案是可以的。 測試三、 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"]
}
}
}
}
}
}
}
]);
這個查詢得到了我們想要的效果,但是這個關(guān)聯(lián)查詢太費勁了,不單是代碼一大推,并且還要處理關(guān)聯(lián)數(shù)據(jù)(RelationData)的結(jié)構(gòu)……因為所有的數(shù)據(jù)都放在同一張表中,之前我們處理過這張表,現(xiàn)在還要處理一遍,不太情愿 |
|
|