我是MongoDB的新手。
我正在使用Jensegger/Laravel-MongoDB Moloquent功能来处理Mongo DB。
我正在尝试在此方法中创建集合的索引: -
public static void Main()
{
var week_test = Convert.ToDateTime("05/06/2018");
var week_test2 = Convert.ToDateTime("05/13/2018");
List<DateTime> weekList = new List<DateTime>();
weekList.Add(week_test);
weekList.Add(week_test2);
CultureInfo ciCurr = CultureInfo.CurrentCulture;
foreach(var week in weekList)
{
int weekNum = ciCurr.Calendar.GetWeekOfYear(week, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday);
Console.WriteLine(weekNum);
}
}
然而,我收到错误: -
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;
如何检查集合是否存在,如果不存在,则创建新集合?
编辑:
这是我的MongoTest模型: -
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();
}
答案 0 :(得分:3)
你好像从某个地方得到了部分答案。 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']);
});
}
}
然后您可以detailed within the documentation
运行迁移如果您决定在迁移过程之外运行代码,那么获取MongoDB\Collection
对象的备用句柄可以是:
DB::collection('test')->raw(function($collection) {
return $collection->createIndex([ 'loc' => '2dsphere' ])
}
无论你做什么,虽然这段代码不属于控制器。创建索引的代码只需运行一次。通常&#34;只有一次&#34;在你的数据库部署上,但在每个应用程序启动时发出命令并没有什么坏处,但是每次请求肯定都会受到伤害。所以不要把它放在那里。