2017-01-24 1 views
3

enter image description here 삽입 작업 관련 데이터에 Mongo 데이터베이스를 사용하고 있습니다. 제목 및 설명 입력란에서 텍스트 검색을 사용하여 GEO 위치 좌표에 따라 개수를 가져 오려고합니다.Mongodb 텍스트 필터 및 그룹 쿼리를 사용하여 geolocation을 단일 쿼리로 검색

우리가 기록

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"(제목), 위도 - 경도 좌표로 검색 및 거리 오십마일와 관련이 있다고 가정, 거리가 처음 3 개 기록 ID [1,2에 제공된 경우, 3] PHP의 제목은 처음 두 레코드 id [1,2]에 들어 왔고 사용자는 결과를 카운트로 얻을 것입니다. 2. mongo 데이터베이스 또는 PHP mongo 데이터베이스 드라이버 쿼리에서 어떻게 쿼리 할 수 ​​있습니까? 데이터베이스 구조를 이미지로 첨부 할 것입니다. 어떤 질문이 있으면 알려주십시오. 미리 감사드립니다.

+0

이상한, 내가 어떤 PHP 코드를 볼 수 없어? – ArtisticPhoenix

+0

집계를 사용하는 것이 좋습니다. Mongo는'$'와 큰 따옴표를 사용하기를 좋아합니다. 그래서 당신은'$ \ '를 \\ field와 같이 백 슬래시 (\)로 이스케이프하고 싶을 것이다. 그렇지 않으면 PHP는 변수를 생각할 것이다. 미안 나는 집에있다. 그래서 나는 어떤 Mongo Examples도 편리하지 않다. – ArtisticPhoenix

답변

4

Mongodb/Driver/Query에는 다음과 같이 입력 할 수 있습니다. {{id : null}, {$ group : 이 같은 사용

$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 % like PHP %"연산자처럼 mysql 쿼리를 실행하려고하지만 "where title = php"와 같이 동작하고 group by 절에서 계산을 원합니다. 제발 도와주세요. –

+0

고마워 동생 :) :) –

+0

@ 로한 사남은 그룹으로 계산하고 싶습니다. 나는 연산자와 같은 제목으로 검색하고 싶습니다. –

0

확인이 SARDAR의 지을 :

db.hotels.find ({ "$ 텍스트": { "$ 검색": "테스트"}, "위치" { "$ geoWithin": { "$ centerSphere"[[72.867804, 19.076033, 5000]}} :

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

-1

난 당신이 필요하다고 생각 : {근처 ​​: {type : "Point", 좌표 : [-73.86, 41.07]}, distanceField : "dist.calculated", maxDistance : 100000, includeLocs : "dist.location", num : 1225, 구형 : true, "쿼리": { "title":/sales/ }}, {$ unwind : '$ loc', {$ group : {$ id}}, {$ sum : 1}}, {$ project : {res : {loc :

관련 문제