<?php
namespace App\Service;
use App\Interfaces\HotelMongoInterface;
use MongoDB\Client;
use MongoDB\Collection;
use MongoDB\Database;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class HotelMongo implements HotelMongoInterface
{
/** @var Client */
private $conn;
/** @var Database */
private $db;
/** @var Collection */
private $collection;
public function __construct(ParameterBagInterface $bag){
$this->conn = new Client($bag->get('hotels_mongo_url'));
$this->db = $this->conn->selectDatabase($bag->get('hotels_mongo_db'));
}
public function select(string $collection){
$this->collection = $this->db->selectCollection($collection);
}
public function findAll(){
return $this->findBy([]);
}
public function findBy(array $criteria, $limit = null, $offset = null, $sort = null, $dir = 'asc'){
$dir = $dir == 'asc' ? 1 : -1;
$options = [];
if(!empty($limit)){
$options["limit"] = (int)$limit;
}
if(!empty($offset)){
$options["skip"] = (int)$offset;
}
if(!empty($sort)){
$options['sort'] = [
$sort => $dir
];
}
$results = $this->collection->find($criteria, $options);
if(empty($results)){
return [];
}
$results = $results->toArray();
$data = [];
foreach ($results as $result){
$data[] = iterator_to_array($result);
}
return $data;
}
public function updateOneFromJson($json, $collection){
$data = json_decode($json, true);
$id = array_shift($data);
$this->select($collection);
$hotel = $this->collection->find(["id" => $id]);
if(!empty($hotel->toArray())){
$this->collection->updateOne(["id" => $id],['$set' => $data]);
}
}
public function updateOneFromArray(string $id, array $data,string $collectionName){
$collection = $this->db->selectCollection($collectionName);
$item = $collection->find(["id" => $id]);
if(!empty($item->toArray())){
$collection->updateOne(["id" => $id],['$set' => $data]);
}
}
public function updateManyFromArray(string $id, array $data,string $collectionName){
$collection = $this->db->selectCollection($collectionName);
$collection->updateMany([],$data);
}
public function count($criteria = []){
$result = $this->collection->count();
if(!empty($criteria)){
$result = $this->collection->countDocuments($criteria);
}
return $result;
}
public function findByKey($key,$value){
$result = $this->collection->find([$key => $value]);
return $result->toArray();
}
public function findByRating(){
$collection = $this->db->selectCollection("hotels_ru");
$criteria = ['$and' =>[ ['$or' => [['deleted' => false],['is_closed'=>false]]], ["reviews.rating" => ['$lt' => 2 ]]]];
$items = $collection->countDocuments($criteria);
$k = 777;
}
public function mongoIn($params){
if(isset($params["search"])){
unset($params["search"]);
}
if(isset($params["page"])){
unset($params["page"]);
}
if(!empty($params) && isset($params[0]["search"])){
unset($params[0]);
// unset($params["id"]);
unset($params["locale"]);
}
$criteria = ['$and' =>[ ['$or' => [['deleted' => false],['is_closed'=>false]]]]];
$subCriteria = [];
if(count($params) > 1){
$item = [];
foreach ($params as $key=>$param){
foreach ($param as &$p){
if(intval($p)){
$p = intval($p);
}
}
if($key == "rating"){
$item[]["reviews.rating"] = ['$gte'=> $p];
} else{
$item[][$key] = ['$in' => $param];
}
}
$subCriteria['$and'] = $item;
} else {
foreach ($params as $key=>$param){
foreach ($param as &$item){
if(intval($item)){
$item = intval($item);
}
}
if($key == "rating"){
$subCriteria["reviews.rating"] = ['$gt'=> $item];
} else{
$subCriteria[$key] = ['$in' => $param];
}
}
}
if(!empty($subCriteria)){
array_push($criteria['$and'],$subCriteria);
}
return $criteria;
}
public function dropCollection($collectionName){
$this->db->dropCollection($collectionName);
}
public function search(string $search, string $collectionName, string $fieldName){
$collection = $this->db->selectCollection($collectionName);
if(empty($search)){
return [];
}
$search = '^'.$search.'';
$result = $collection->find([$fieldName =>['$regex'=>$search,'$options' => 'i'], "country_code" => "RU"]);
return $result->toArray();
}
}