2017-04-30 7 views
0

のは、マイドキュメントのいくつかは、次のような構造を持っているとしましょう:Cloudant /マンゴーセレクタ

{ 
    "something":{ 
     "a":"b" 
    }, 
    "some_other_thing":{ 
     "c":"d" 
    }, 
    "what_i_want":{ 
     "is_down_here":[ 
     { 
      "some":{ 
       "not_needed":"object" 
      }, 
      "another":{ 
       "also_not_needed":"object" 
      }, 
      "i_look_for":"this_tag", 
      "tag_properties":{ 
       "this":"that" 
      } 
     }, 
     { 
      "but_not":{ 
       "down":"here" 
      } 
     } 
     ] 
    } 
} 

が正常値"this_tag"を持つ"i_look_for"を上選択できマンゴーJSONセレクタはありますか?それは配列内にあります(配列内の位置を知っています)。結果をフィルタリングすることにも興味がありますので、結果には"tag_properties"しかありません。

$ elemMatchを含む多くのことを試しましたが、すべてが "無効なjson"を返すものがほとんどです。

これはマンゴーの使用例でもありますか、私は意見を付けるべきですか?

答えて

4

Cloudantでクエリ(マンゴー)セレクタ文では、クエリを実行する前に適切なインデックスを定義する必要があります。

{ 
    "selector": { 
    "what_i_want.is_down_here.0": { 
     "i_look_for": "this_tag" 
    }, 
    "what_i_want.is_down_here.0.tag_properties": { 
     "$exists": true 
    } 
    }, 
    "fields": [ 
    "_id", 
    "what_i_want.is_down_here.0.tag_properties" 
    ] 
} 

上記の解決策は、あなたが常に知っていることを前提としてい

JSON型CQ指数JSON型インデックスに対する

{ 
    "index": { 
    "fields": [ 
     "what_i_want.is_down_here.0" 
    ] 
    }, 
    "type": "json" 
} 

セレクター:このことを念頭に置いて、ここにあなたの答えです/あなたが望むフィールドがis_down_here配列の0番目の要素内にあることを保証できます。

この質問には別のCQインデックスタイプで回答する別の方法があります。 This article explains the differencesであり、クエリの配列を示す有用な例があります。今、あなたは別のインデックス・タイプについてもう少し知っていることを、ここにあなたがLucene検索/「テキスト」型CQインデックスにあなたの質問に答えるだろう方法は次のとおりです。

テキスト型CQインデックス

{ 
    "index": { 
    "fields": [ 
     {"name": "what_i_want.is_down_here.[]", "type": "string"} 
    ] 
    }, 
    "type": "text" 
} 

テキスト型インデックスに対するセレクタ

{ 
    "selector": { 
    "what_i_want.is_down_here": { 
     "$and": [ 
     {"$elemMatch": {"i_look_for": "this_tag"}}, 
     {"$elemMatch": {"tag_properties": {"$exists": true}}} 
     ] 
    } 
    }, 
    "fields": [ 
    "_id", 
    "what_i_want.is_down_here" 
    ] 
} 

記事を読んで、あなたはそれぞれのアプローチは、そのトレードオフがあることを学びます:JSON型のインデックスは(することができる唯一のインデックスサイズが小さく柔軟で特定の要素)。 text-typeはより大きいがより柔軟です(すべての配列要素をインデックスできます)。また、この例から、投影値にもいくつかのトレードオフがあることがわかります(アレイ全体に対して特定の値を投影する)。これらのスレッドで

より多くの例:

2

私が正しくあなたの質問を理解していた場合は、docsに応じてこれを行うためのサポートされている2つの方法があります。

{ 
    "what_i_want": { 
     "i_look_for": "this_tag" 
    } 
} 

は省略形と同等でなければなりません:

{ 
    "what_i_want.i_look_for": "this_tag" 
} 
+0

これが0のドキュメントを返します。私はi_look_for'がwhat_i_want' 'の直接のプロパティではありません'ので、それはだ理解しますが、配列 'is_down_here'のメンバー – zlr

+2

' what_i_want.0.i_look_for'を試しましたか? – Flimzy

+2

非常にクール、それは動作します。私はこの配列の表記法を試しましたが、失敗しました。ありがとう!次の質問は、どのように私はpositionnal引数を避けることができますが、そこに新しい答えがあるので、私はすべて設定する必要があります – zlr

関連する問題