0

我是 MongoDB 的新手。

我正在使用Jensegger/Laravel-MongoDB Moloquent功能来处理 Mongo DB。

我正在尝试用这种方法创建一个集合的索引:-

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';
}
4

1 回答 1

5

你似乎从某个地方得到了部分答案。Schema应该从“ Larvel Migration”中获取,这是在应用程序中实际定义索引的一种推荐方式。

该过程将设置如下:

创建迁移

php artisan make:migration create_location_index

然后更改结构以添加updown创建和删除索引:

<?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' ])
}

尽管此代码不属于控制器,但无论您做什么。创建索引的代码只需要运行一次。通常在您的数据库部署中“仅”一次,但是在每次应用程序启动时发出命令并没有真正的伤害,但是对于每个请求来说肯定会受到伤害。所以不要把它放在那里。

于 2018-05-18T08:40:14.753 回答