4

我遇到的情况是,我正在使用字符串查询 MongoDB,以获取在对象层次结构中不止一层的字段。此查询必须是字符串。例如,我在 Groovy 中查询类似这样的内容:

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

没有出现问题,我想在结果中找到嵌套字段的值。使用 GPath,我可以深入一层并获得 a 的价值

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 中不起作用。这里记录了一个错误,但我想知道是否有更好的解决方法可以用于这种情况,它比我通过在点上拆分然后构建对象遍历来解析字符串更干净。请注意,“abc”在运行时是可变的并且是未知的(例如,它可能是“abd”)。

4

1 回答 1

2

基于错误/线程,支持点属性访问器似乎存在一些歧义问题。根据邮件列表线程,评估 queryField 字符串似乎是您最好的选择:

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

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

Groovy Web 控制台上的脚本

邮件列表线程有点旧,所以有一个新的(至少从 1.7.2 开始)Eval 类可以帮助运行没有大绑定的小片段。

否则,您可以拆分字符串并递归地对对象进行属性评估,从而有效地再现 GPath 遍历行为的子集。

于 2012-02-07T19:24:07.793 回答