Создать индекс используя Moloquent с Laravel - PullRequest
0 голосов
/ 18 мая 2018

Я новичок в MongoDB.

Я использую функции Jensegger / Laravel-MongoDB Moloquent для работы с БД Mongo.

Я пытаюсь создать индексколлекции в этом методе: -

Schema::collection('events', function ($table) {
     $table->index(['location' => '2dsphere']);
});

Однако я получаю ошибку: -

Class Jenssegers\Mongodb\Schema' not found

Я также добавил эти два: -

use Jenssegers\Mongodb\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

У меня есть метод контроллера, который приведен ниже: -

public function fetchMongoTest(Request $request){
    $error = FALSE;
    $respond = array();
    $detail = array();
    $err_message = array();
    $err_validation = array();
    $api_code       = 2001; 
    try 
    {
        if ($request->isMethod('post')) 
        {
            $latitude = (float)$request->latitude;
            $longitude = (float)$request->longitude;
            $status     = 1;
            $mongoData = array();
            $monTestObj = new Mongotest;

            Schema::collection('events', function ($table) {
                $table->index(['location' => '2dsphere']);
            });

            $monTestObj->location = ['type' => 'Point', 'coordinates' => [100.0, 0.0]];
            $monTestObj->save();



            $users = MongoTest::where('loc', 'near', [
                '$geometry' => [
                    'type' => 'Point',
                    'coordinates' => [
                        $longitude,
                        $latitude
                    ]
                ],
                '$maxDistance' => 10,
            ]);

            foreach($users as $u)
                {
                    print_r($u->name);
                }


        }
        else 
        {
            $status     = 0;
            $message    = Config::get('customConfig.api_messages.ENG.post_request_mandatory');
            $err_message[] = $message;
        }
    }
    catch(Exception $e) 
    {
        $status = 0; 
        echo $e->getMessage(); die;
        $message=Config::get('customConfig.api_messages.ENG.exception_error');
    }
    $response['status']         = $status;
    $response['message']        = $message;
    $response['details']        = $detail;
    $response['error']          = $err_message;
    $response['error_validation_key'] = $err_validation;
    $response['api_version']    = $this->api_version;
    $response['api_code']       = $api_code;

    $respond['fetch-activity-list-prime'] = $response;
    $jsonResult = json_encode($respond);    
    header('Content-Type: application/json; charset=utf-8');    
    echo $jsonResult ;      
    exit();
}

Как проверить, существует ли коллекция, и если нет, создать новую коллекцию?

РЕДАКТИРОВАТЬ:

Это моя модель MongoTest: -

<?php
namespace App\Http\Model;
//use Illuminate\Database\Eloquent\Model;
use Moloquent;
class MongoTest extends Moloquent
{
    protected $connection = 'mongodb';
    protected $collection = 'test';
    //protected $collection = 'rh_country_help_text';
}

1 Ответ

0 голосов
/ 18 мая 2018

Вы, кажется, получили частичный ответ откуда-то.Schema должен быть выбран из "Larvel Migration" , который является одним из рекомендуемых способов определения индексов в вашем приложении.

Процесс будет настроен следующим образом:

Создание миграции

php artisan make:migration create_location_index

Затем измените структуру, добавив up и down для создания и удаления индекса:

<?php

    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;

    class CreateLocationIndex extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::connection('mongodb')->table('test', function (Blueprint $collection) {
                $collection->index([ "loc" => "2dsphere" ]);
            });
        }

        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::connection('mongodb')->table('test', function (Blueprint $collection) {
                $collection->dropIndex(['loc_2dsphere']);
            });
        }
    }

Затем выможно запустить миграцию как , как подробно описано в документации

Если вы решите запустить код вне процесса миграции, то альтернативные дескрипторы для получения объекта MongoDB\Collection могутбыть как:

DB::collection('test')->raw(function($collection) {
  return $collection->createIndex([ 'loc' => '2dsphere' ])
}

Что бы вы ни делали, хотя этот код не принадлежит контроллеру.Код для создания индекса нужно запускать только один раз.Как правило, "только один раз" при развертывании базы данных, но на самом деле не вредно вводить команду при каждом запуске приложения, однако это, безусловно, больно при каждом запросе.Так что просто не кладите это туда.

...