4

私が抱えている状況は、オブジェクト階層の1レベル以上深いフィールドの文字列を使用してMongoDBにクエリを実行していることです。このクエリは文字列である必要があります。たとえば、Groovyで次のようなものをクエリしています。

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

結果として、ネストされたフィールドの値を見つけたいという問題は発生しません。GPathを使用すると、1レベル深くなり、これを行うことでの価値を得ることができます。

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

GroovyWebコンソールのスクリプト

メーリングリストのスレッドは少し古いので、大きなバインディングを持たない小さなスニペットの実行に役立つ新しい(少なくとも1.7.2以降の)Evalクラスがあります。

それ以外の場合は、文字列を分割してオブジェクトのプロパティ評価を再帰的に実行し、GPathトラバーサル動作のサブセットを効果的に再現できます。

于 2012-02-07T19:24:07.793 に答える