2017-07-11 23 views
0

我有一個艱難的時候試圖用多種多樣鍵,在一個對象檢索字段的值,例如:MongoDB的:使用查詢值變化鍵,在一個對象

運行命令:

db.stuff.find() 

將給:

{ 
    "_id":ObjectId("5963e65f948dc563d6375f7b"), 
    "color_map":{ 
     "APPLE":"red", 
     "BANANA":"yellow", 
     "SKY":"blue" 
    }, 
    "type":"APPLE" 
} 
{ 
    "_id":ObjectId("5963e65f948dc563d6375f77"), 
    "color_map":{ 
     "BANANA":"yellow", 
     "PEACH":"pink", 
     "SKY":"blue" 
    }, 
    "type":"PEACH" 
} 

所以,問題是,如何使用純MongoDB的運營商(會更喜歡使用聚合運營商),得到以下的結果,使色彩效果:

{ 
    "_id":ObjectId("5963e65f948dc563d6375f7b"), 
    "type":"APPLE", 
    "color":"red" 
} 
{ 
    "_id":ObjectId("5963e65f948dc563d6375f77"), 
    "type":"PEACH", 
    "color":"pink" 
} 

後續:MongoDB的版本是3.2.9,並升級到最新版本,將導致其他組件崩潰,所以我們可以實現它,而無需使用$ objectToArray(3.4.4新)?

+0

JS的解決方案看起來像那種存儲該信息一種奇怪的方式。你確定這是滿足你需求的最佳方式嗎? –

回答

0

您可以使用$objectToArraycolor_map嵌入式文檔轉換爲3.4.4版本中的鍵值數組(k v)對。

$indexOfArray操作者找到color_map匹配type's索引隨後$arrayElemAt檢索在發現索引和突出元件的值存入color字段中的元素。

$letin表達式中創建colorkvs變量和引用。

類似下面

db.collectionname.aggregate([ 
    { 
     "$project": { 
     "color": { 
      "$let": { 
      "vars": { 
       "colorkvs": { 
       "$objectToArray": "$color_map" 
       } 
      }, 
      "in": { 
       "$let": { 
       "vars": { 
        "colorkv": { 
        "$arrayElemAt": [ 
         "$$colorkvs", 
         { 
         "$indexOfArray": [ 
          "$$colorkvs.k", 
          "$type" 
         ] 
         } 
        ] 
        } 
       }, 
       "in": "$$colorkv.v" 
       } 
      } 
      } 
     }, 
     "type":1 
     } 
    } 
]) 

您可以通過刪除外$let表達縮短管道。

db.collectionname.aggregate([ 
    { 
    "$project": { 
     "color": { 
     "$let": { 
      "vars": { 
      "colorkv": { 
       "$arrayElemAt": [ 
       { 
        "$objectToArray": "$color_map" 
       }, 
       { 
        "$indexOfArray": [ 
        { 
         "$objectToArray": "$color_map" 
        }, 
        "$type" 
        ] 
       } 
       ] 
      } 
      }, 
      "in": "$$colorkv.v" 
     } 
     }, 
     "type": 1 
    } 
    } 
]) 

較低版本

db.collectionname.find({}).map(doc => ({ 
    "_id": doc._id, 
    "type": doc.type, 
    "color": doc.color_map[Object.keys(doc.color_map).find(k => k === doc.type)] 
})); 
相關問題