Sco*_*ott 6 grails groovy mongodb gpath
我遇到的情况是,我正在使用字符串查询 MongoDB,以查找对象层次结构中超过一级深度的字段。此查询必须是字符串。例如,我在 Groovy 中查询类似的内容:
def queryField = 'a.b.c' //this is variable and can be different every time
def result = mongodb.collection.findOne([queryField:5])
Run Code Online (Sandbox Code Playgroud)
问题不会出现,在结果中我想找到嵌套字段的值。有了 GPath,我可以深入一层并获得 a 的值
def aObj = result."a" //or result["a"]
Run Code Online (Sandbox Code Playgroud)
然而,我想通过做这样的事情来更深入:
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
Run Code Online (Sandbox Code Playgroud)
目前这在 Groovy 中不起作用。这里记录了一个错误,但我想知道是否有更好的解决方法可以用于这种情况,它比我通过在点上拆分来解析字符串然后构建对象遍历要干净一些。请注意,“abc”在运行时是可变且未知的(例如,它可能是“abd”)。
根据错误/线程,支持点属性访问器似乎存在一些模糊问题。根据邮件列表线程,评估 queryField 字符串似乎是您最好的选择:
def result = [a: [b: [c: 42]]]
def queryString = 'a.b.c'
def evalResult = Eval.x(result, 'x.' + queryString)
assert evalResult == 42
Run Code Online (Sandbox Code Playgroud)
邮件列表线程有点旧,所以有一个新的(至少从 1.7.2 开始)Eval 类可以帮助运行没有大绑定的小片段。
否则,您可以拆分字符串并递归地对对象进行属性评估,从而有效地再现 GPath 遍历行为的子集。
| 归档时间: |
|
| 查看次数: |
2762 次 |
| 最近记录: |