2017-01-24 1 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 записей ID [1,2, 3], а заголовок PHP появился в первых двух записях id [1,2], тогда пользователь получит результат как счет 2. Как мы можем сделать запрос для этого в базе данных mongo или в запросе драйвера PHP mongo? Мы собираемся прикрепить нашу структуру базы данных как образ. Если у вас есть какие-либо вопросы, дайте нам знать. Заранее спасибо.

+0

Странно, я не вижу никакого php-кода? – ArtisticPhoenix

+0

Вы хотите использовать для этого агрегацию. Монго любит использовать '$' и двойные кавычки. поэтому вы захотите избежать '' 'с обратным слэшем '\', как это поле' '\ $", иначе php будет считать свою переменную. Извините, что я дома, поэтому у меня нет никаких примеров Mongo. – ArtisticPhoenix

ответ

4

В Mongodb/Driver/Query это может быть используется как этот

$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

Спасибо @Rob, чтобы ответить на мой вопрос. Если я удалю этот {"title":/php /}, то ваш запрос работает нормально. Я хочу запустить запрос как mysql, как оператор «title like% PHP%». Но он ведет себя как «where title = php», и мы хотим, чтобы count из предложения group by. Пожалуйста, дайте нам помощь. –

+0

спасибо брату :) :) –

+0

@ The Rohan Sanap мы хотим считать с группой, и я хочу искать название с таким же оператором. –

0

проверки этого Сардар джи:

db.hotels.find ({ "$ текст": { "$ поиск": "тест"}, "место": { "$ geoWithin": { "$ centerSphere": [[72.867804, 19.076033], 5000]}}})

-1

Я думаю, что вам это нужно:

db.crawled_jobs.aggregate ([{$ geoNear: {рядом: {тип: "Точка", координаты: [-73.86, 41.07]}, distanceField: «dist.calculated», maxDistance: 100000, includeLocs: «dist.location», num: 1225, сферическое: true, «query»: {«title»:/sales/ }}}, {$ unwind: '$ loc'}, {$ group: {_ id: '$ loc', count: {$ sum: 1}}}, {$ project: {res: {loc: '$ _ id', count: '$ count' }}}, {$ group: {_ id: null, total: {$ sum: 1}, data: {$ addToSet: '$ res'}}}])

Смежные вопросы