2017-01-12 4 views
0

地理空間クエリから結果を返そうとしているローカルエミュレータを使用しています。私の頭を剃るという事実がなければ、私は髪を裂くだろう。私は何をしようとしているのか、ここで試したことを説明しました。 https://social.msdn.microsoft.com/Forums/en-US/79c449c9-4fe7-43cf-ba07-6b168ead60da/struggling-with-this-geospatial-linq-query-?forum=AzureDocumentDBインデックスが必要なクエリで苦労しています

あなたの提案があれば、すべてのものを愛し、助けてください。私の人生は、この厄介な質問に関して、ここで分かれています。

ご協力いただきありがとうございます。

-r

+0

私はあなたの質問に投票しませんでしたが、あなたの質問の肉体をリンクの反対側に置かない方がいいかもしれないので、他の方がよいかもしれません。その内容を編集して質問に反映させることをお勧めします。 –

答えて

0

私はあなたのデバイスのアレイを平らにし、「ST_DISTANCEを()」を使用する自己結合を行うことができると信じています。それはこのようなものに見えるでしょう。

SELECT d.name 
FROM users u 
JOIN d IN u.devices 
WHERE ST_DISTANCE(d.currentLocation, <user location>) < 500 

インデックスを使用することは確実ではありませんが、私はそうすると思います。

これがうまくいかない場合は、スキーマを調整する別の方法があるかもしれません。すべてのデバイス位置の非正規化ポリゴンを格納します。次に、ユーザーが指定された半径を中心とする円に近似する多角形を生成することができます。次に、ST_INTERSECTS()を使用してこのシミュレートされたサークルを使用して、すべてのデバイスの非正規化ポリゴンに対してクエリを作成できます。

私はこれを試していないので、私はそれがインデックスを使用することは確かではありませんが、それは非常に可能性が高いと思います。また、あなたの非正規化されたポリゴンの構成は難しいかもしれません。私はあなたがデバイスの中心を見つけて、各デバイスからセンターまたはセンターの近くに移動し、次のデバイスなどに戻るような星型にすることをお勧めします。この方法では、はるかに少ないですユーザの位置が2つのデバイスの間にあり、いずれもユーザの指定された半径内にないという結果が返ってくる。

0

私はラリーの提案に本当に感謝しています。私は実際には私が持っていたクエリでそれを動作させることができました。 Azureのポータルが自動的に私のためのポリシーを作成し、ローカルのDocumentDBエミュレータを作成していないことが判明しました。だから私はAzureのポリシーを作成してそれを私のエミュレータに貼り付け、私の最後のクエリは期待どおりに機能しました。参考までに、ポリシーは次のとおりです。

{ 
    "indexingMode": "consistent", 
    "automatic": true, 
    "includedPaths": [ 
    { 
     "path": "/*", 
    "indexes": [ 
    { 
     "kind": "Range", 
     "dataType": "Number", 
     "precision": -1 
    }, 
    { 
     "kind": "Range", 
     "dataType": "String", 
     "precision": -1 
    }, 
    { 
     "kind": "Spatial", 
     "dataType": "Point" 
    } 
    ] 
} 
], 
"excludedPaths": [] 
} 

もう一度ありがとうございます!とても有難い!