Hiển thị các bài đăng có nhãn Chú ý. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Chú ý. Hiển thị tất cả bài đăng

Thứ Hai, 22 tháng 10, 2018

Cách update document mongo có chứa nested document ko bị lỗi thêm các field thừa

Trước tiên tải PHP Library for MongoDB (PHPLIB) bằng composer bằng lệnh

 composer require mongodb/mongodb

Hoặc tải tại địa chỉ

https://github.com/mongodb/mongo-php-library

Để  PHP Library for MongoDB vào thưc mục common/vender

Mở file index.php hoặc bootstrap_web.php(đối với ứng dụng multi modules) thêm đoạn code

require APP_PATH . '/common/vendor/autoload.php';


Hàm kết nối csdl mongo trong file services.php

/* *  new MongoDB\Client và new Client() là tương đương nhau * new MongoDB\Client nằm trong library mongo for php 7. * new Client nằm trong incubator * Nội dụng 2 Client này tương đương nhau */
$di->set('mongo', function () use ($di) {   // $config  = $di->get('config')->mongodb;    $client = new MongoDB\Client('mongodb://' . $this->getShared('config')->database->host . ':' . $this->getShared('config')->database->port);    return $client->selectDatabase($this->getShared('config')->database->dbname);}, true);//MongoDB Database/*$di->setShared('mongo',function(){    $mongo = new Client();
   return $mongo->selectDatabase($this->getShared('config')->database->dbname);
});*/


Giả sử ta có class Places chứa thuộc tính Location, Location là 1 class có chứa 2 thuộc tính lat và lng như sau

Class Location

class Location{    public $lat;    public $lng;
}


Class Place

class Place extends MongoCollection{
    public $name;
    //private $description;
    public  $location;
}

Phương thức xử lí tạo mới và update thông tin Place là saveAction() có code như sau

$location = new Location();
$place->name     = $this->request->getPost('name',['striptags','trim']);
$place->address  = $this->request->getPost('address',['striptags','trim']);
$place->city_id  = $this->request->getPost('city_id',['striptags','trim']);
$location->lat   = $this->request->getPost('lat',['striptags', 'trim']);
$location->lng   = $this->request->getPost('lng',['striptags', 'trim']);
$place->location = $location;

if(isset($_id)){ // Xử lí update khi biến $_id đã có giá trị
 /*   Khi sử dụng new PlaceForm($place) thì nó sẽ tự động gán thêm 
2 thuộc tính lat và lng vào place   nếu ko unset hoặc dùng $this->mongo->Places->updateOne thì trong documanet place sẽ thêm 
2 trường lat và lng
    $this->mongo->Places->updateOne(         ["_id" => new ObjectID($_id)],         ['$set' =>[ 'name'     => $place->name,                     'address'  => $place->address,                     'city_id'  => $place->city_id,                     'location' => $location,                     'photos'   => $place->photos,             ]
         ]     );*/   unset($place->lat);   unset($place->lng); }$place->save();


Nếu ko dùng cách trên thì khi update Place sẽ có thêm 2 filed lat và lng trong document của Collection Place



Bài 4- Volt Filter -phalcon

  1/ Volt Filter Đây cũng là một bộ lọc giống như phần Filter ở bài 3 , tuy nhiên có bổ sung thêm một số phương thức mới để áp dụng vào ứng ...