2017-01-24 15 views
3

enter image description here私たちは挿入ジョブ関連のデータにMongoデータベースを使用しています。タイトルと説明フィールドのテキスト検索でGEOの位置座標に基づいてカウントを取得したいMongodbテキストフィルタを使用し、単一のクエリでグループ化するジオロケーションを検索

我々はレコード

id title     coordinates[0]  coordinates[1] 
--+-----------------------+---------------------+---------------- 
1 PHP developer   | 97.77    | -92.99 
2 Laravel developer,php | 97.77    | -92.99 
3 python     | 97.77    | -92.99 
4 Rails     | 23.77    | -34.99 
5 Python, php   | 23.77    | -34.23 

ユーザ「PHP」(タイトル)、緯度経度座標と検索と距離50マイルと特定があると、距離が第3のレコード番号[1,2に来た場合、 3] PHPのタイトルは最初の2つのレコードid [1,2]に入っているので、ユーザは結果をカウントとして取得するでしょう。2.どのようにしてmongoデータベースかPHP mongoデータベースドライバクエリでこれをクエリできますか?データベース構造をイメージとして添付します。ご質問がありましたらお知らせください。前もって感謝します。

+0

奇妙なことに、私はPHPコードが表示されません? – ArtisticPhoenix

+0

集約を使用したいと思うでしょう。 Mongoは '$'と二重引用符を使いたい。だから '$ \ 'を\'フィールドのようにバックスラッシュ '\'でエスケープしたいと思うでしょう。さもなければPHPはその変数を考えるでしょう。申し訳ありませんが私は自宅にいるので、私は便利なMongoの例はありません。 – ArtisticPhoenix

答えて

4

Mongodb/Driver/Queryの場合は、次のように入力します。{{id:null}このように使用されました

$queryString = [ 
        [ 
         '$geoNear'=> [ 
         'near'=> [ 'type'=> "Point", 'coordinates'=> [-73.86, 41.07 ] ], 
         'distanceField'=> "dist.calculated", 
         'maxDistance'=> '5000', 
         'includeLocs'=> "dist.location", 
         'num'=> 10000, 
         'spherical'=> true, 
         'query' => ['title'=> ['$regex' => 'sales' ]] 
         ] 
        ], 
        ['$unwind'=> '$loc'],  
        ['$group'=>['_id'=> '$loc', 'count'=>['$sum'=>1]]], 
        ['$project'=>['res'=>['loc'=>'$_id', 'count'=>'$count']]], 
        ['$group'=>['_id'=>null, 'total'=>['$sum'=>1], 'data'=>['$addToSet'=>'$res']]], 
       ]; 
    $conn = new \MongoDB\Driver\Manager("mongodb://username:[email protected]:2702/admin"); 
    $command = new \MongoDB\Driver\Command([ 
       'aggregate' => 'collection_name', 
       'pipeline' => $queryString 
      ]); 

    $result = $conn->executeCommand('mongodbname', $command); 
0

これを試してみてください:

db.crawled_jobs.aggregate([{ "$geoNear": {"near": { "type": "Point", "coordinates": [ -73.86, 41.07 ] },"spherical": true,"maxDistance": 500000, 
"distanceField": "distance","query": {"title": /php/}}}]) 
+0

ありがとう@ロブ私の質問に私はこの{"タイトル":/ php /}を削除する場合、あなたのクエリは正常に動作しています。私は、mysqlのように演算子 "title%%PHP%"のようにクエリを実行したいが、 "where title = php"のように動作し、group by節から数えたいと思う。私たちに助けてください。 –

+0

ありがとう兄弟:) –

+0

@ロハン・サナップはグループで数えたいと思っています。 –

0

チェックこのサルダールのJI:

db.hotels.find({ "$テキスト":{ "$検索": "テスト"}、 "場所": { "$ geoWithin":{ "$ centerSphere":[[72.867804、19.076033]、5000]}}:

db.crawled_jobs.aggregate([{$ geoNear})

-1

私はあなたがこれを必要だと思います。 {近:{タイプ: "ポイント"、座標:[-73.86、41.07]}、 {$ title: "dist"} "dist.calculated"、maxDistance:100000、includeLocs: "dist.location"、num:1225、 球:真、 "クエリ":{"タイトル":/ sales/ }}、{$ unwind: '$ loc'、{$ group:{$ id}}、{$ sum:1}}、{$ project:{res:{loc:

関連する問題