2012-02-07 49 views
4

我遇到的情況是,我正在使用字符串查詢MongoDB,該字符串是對象層次結構中多於一個深度的字段。這個查詢必須是一個字符串。因此,例如,我在Groovy查詢是這樣的:使用GPath深入遍歷字符串中帶點的Groovy對象的方法

def queryField = 'a.b.c' //this is variable and can be different every time 
def result = mongodb.collection.findOne([queryField:5]) 

的問題沒有出現在結果我想找到嵌套字段的值。隨着GPATH我能去一個層次深,獲得的價值做這個

def aObj = result."a" //or result["a"] 

但是我想通過做這樣的事情去比更深:

def queryField = "a.b.c"  //this can change every time and is not always 'a.b.c' 
def cObj = result[queryField] //since field is variable, can't just assume result.a.b.c 

這並不是在Groovy工作現在。有一個記錄here的錯誤,但我想知道是否有更好的解決方案用於這種場景,這比我通過分割點然後構建對象遍歷來解析字符串更簡潔。請注意,「a.b.c」在運行時是可變的和未知的(例如,它可能是「a.b.d」)。

+1

我的答案的後半部分在這裏有幫助嗎? http://stackoverflow.com/a/6364388/6509 – 2012-02-07 19:07:42

+0

謝謝@tim_yates,這正是我正在尋找,但無法從我的查詢找到它。你提出的兩個(eval與字符串解析),你推薦。兩者都在做字符串解析,但我認爲可能會慢一點。有什麼想法嗎? – Scott 2012-02-07 19:32:57

+0

我會去注入方法,雖然它的彈性較差,如果你有他們的點像屬性:'a.'some.var'.c' – 2012-02-07 20:12:55

回答

2

基於bug /線程,它會出現支持虛線屬性訪問器的一些模糊性問題。基於郵件列表線程它似乎是評估QUERYFIELD的字符串將是你最好的選擇:

def result = [a: [b: [c: 42]]] 
def queryString = 'a.b.c' 

def evalResult = Eval.x(result, 'x.' + queryString) 
assert evalResult == 42 

Script on Groovy Web Console

郵件列表線程是有點老了,所以有一個新的上下的(因爲在至少1.7.2)Eval類可以幫助運行沒有大綁定的小片段。否則,您可以拆分字符串並遞歸地對對象執行屬性評估,從而有效地重現GPath遍歷行爲的子集。

+0

確認,我沒有看到來自@tim_yates的評論,使用相同的Eval類。 – 2012-02-07 19:25:42