2016-11-07 114 views
4

我有一個情況在蒙戈DB的記錄是這樣的:動態字段名稱搜索MongoDB中

{ 
"_id" : "xxxx", 
"_class" : "xxxx", 
"orgId" : xxx, 
"targetKeyToOrgIdMap" : { 
    "46784_56139542ecaa34c13ba9e314" : 46784, 
    "47530_562f1bc5fc1c1831d38d1900" : 47530, 
    "700004280_56c18369fc1cde1e2a017afc" : 700004280 


    }, 
} 

我必須找出其中targetKeyToOrgIdMap子節點具有一組特定值的記錄。這意味着,我知道在「46784_56139542ecaa34c13ba9e314」:46784部分的記錄中將會出現什麼值。而字段名稱是可變的,它的值和一些隨機字符串的組合。

在上面的例子中,我有46784,我需要找到所有在那個領域有46784的記錄。

有沒有什麼辦法可以引發一些正則表達式或類似的東西,或者使用任何其他的意思,我會得到我需要在字段targetKeyToOrgIdMap的子節點中的值的記錄。

在此先感謝

+0

不可能使用'find()'方法,也許使用'mapReduce'。您可能需要考慮更改您的模式,以使具有鍵和值屬性的對象數組成爲'targetKeyToOrgIdMap',這更容易查詢:'「targetKeyToOrgIdMap」:[{「id」:「46784_56139542ecaa34c13ba9e314」,「value」:46784} ,{ 「id」:「47530_562f1bc5fc1c1831d38d1900」,「value」:47530}]' – chridam

+0

改變模式將不可能。我必須也許跳過這個或什麼...謝謝@chridam –

回答

1

你可以使用MongoDB的$where這樣的:

db.myCollection.find({ $where: function() { 
    for (var key in obj.targetKeyToOrgIdMap) { 
    if (obj.targetKeyToOrgIdMap[key] == 46784){ 
     return true; 
    } 
    } 
}}).each { obj -> 
    println obj 
} 

但要知道,這將需要在功能對每個文檔執行全表掃描。見documentation

+0

這看起來很有前途。請原諒我的無知,我對MongoDB非常陌生;我怎樣才能獲得記錄? 查詢成功執行,但沒有要顯示的記錄。我嘗試做一些像返回鍵/返回{}但沒有工作的東西。你能爲我提供一些幫助嗎? –

+0

根據數據庫驅動程序的不同,使用'find'可能會返回一個數據庫遊標,用於訪問結果。你使用哪個驅動程序? – Erik

+0

我用Groovy使用gmongo。 –