3

20000 を超えるオブジェクトを含む巨大な JSON ファイルがあります。この json ファイルの文字列をクエリしたいと思います。しかし、を使用するjsonpathと、完全一致しか見つかりませんでしたか?

私のファイルが次のようなものだとしましょう:

{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

私がやりたいことは次のとおりです。

jsonPath(data, "$..book[?(@.title like 'ord')]")

タイトルに「ord」が含まれる本を入手します。

{ "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
{ "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
}

出来ますか?

4

1 に答える 1

7

アップデート:

単体テストこの回答によると、式に正規表現リテラルを埋め込むことができ、評価されます。以下は単体テストの例です。

$.menu.items[?(@ && @.label && /SVG/.test(@.label))].id

したがって、あなたの例では、次のようになります。

$.store.book[ ?( @ && @.title && /ord/.test(@.title) ) ].isbn

かなり大きなjsonファイル(2〜3MB)にjsonPathを使用しましたが、それらがアプリケーションの速度低下の原因でした。パフォーマンスが気になる場合は、検索するフィールドごとに補助インデックスを作成することをお勧めします。これを行うと、各フィールドの関連性の値に重みを付けることができます。これは、良い検索結果を得るために非常に重要です。

さらに良いことに、アプリケーションの成長が予想される場合は、サーバー側の検索エンジン ( http://sphinxsearch.com/または SAAS バージョンhttp://indexden.com/ ) を利用することをお勧めします。

特定の問題に関しては、 like 演算子がサポートされているはずです。ただし、文字列の配列 (データ構造のタイトルなど) とプレーンな JavaScript 正規表現 ( http://www.w3schools.com/jsref/jsref_obj_regexp.asp )を使用するだけで、かなり良いパフォーマンスを達成できました。.

于 2013-08-07T15:32:53.797 に答える