我有這些資料:
myMap = {
"2": "facing",
"3": "not-facing"
"1": "hidden"
}
stages [
{
"k": 1,
"v": "hidden"
},
{
"k": 2,
"v": "facing"
},
{
"k": 3,
"v": "not-facing"
}
]
和一個聚合查詢,但是我缺少動態獲取地圖資料的語法:
db.MyCollection.aggregate()
.addFields({
myMaps: myMap
})
.addFields({
stages: stages
})
.addFields({
process: {
$filter: {
input: stages,
as: stageData,
cond: {$eq: [$$stageData.v, $myMaps[$$stageData.k]]}
}
}
})
您可能已經注意到,這種語法:$myMaps[$$stageData.k]不起作用,我應該如何myMaps根據kin的值訪問stageData?
uj5u.com熱心網友回復:
詢問
- 就像您的查詢將 mymap 和 stage 設定為額外欄位
- mymapKeys 是一個額外的欄位添加(你可以
$unset在最后) - 過濾階段,如果
stage.k包含在 mymapKeys 我們保留該成員
*不確定這是否是您需要的,但是從您使用 mongodb 查詢語言的查詢來看,我們沒有getField(doc,$$k)我們只有getField(doc,constant_string)在您的情況下不能使用的查詢,因此這里的成本高于哈希圖查找,這里就像線性成本(檢查陣列中的成員)。對于我們擁有的陣列,$getElementAt(array,$$k)如果這些數字總是按順序排列,1,2,3 等,您可能可以使用陣列而不是物件
玩蒙哥
aggregate(
[{"$set": {"mymap": {"2": "facing", "3": "not-facing", "1": "hidden"}}},
{"$set":
{"mymapKeys":
{"$map": {"input": {"$objectToArray": "$mymap"}, "in": "$$this.k"}}}},
{"$set":
{"stages":
[{"k": 1, "v": "hidden"}, {"k": 2, "v": "facing"},
{"k": 3, "v": "not-facing"}]}},
{"$set":
{"process":
{"$filter":
{"input": "$stages",
"cond": {"$in": [{"$toString": "$$this.k"}, "$mymapKeys"]}}}}}])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/487242.html
