You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
4.3 KiB

<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\mongo;
use \yii\base\Component;
use Yii;
/**
* Class Command
*
* @author Paul Klimov <klimov.paul@gmail.com>
* @since 2.0
*/
class Command extends Component
{
/**
* @var Connection the Mongo connection that this command is associated with
*/
public $db;
/**
* Drops the current database
*/
public function dropDb()
{
$this->db->db->drop();
}
/**
* Drops the specified collection.
* @param string $name collection name.
*/
public function dropCollection($name)
{
$collection = $this->db->getCollection($name);
$collection->drop();
}
/**
* @param $collection
* @param array $query
* @param array $fields
* @return \MongoCursor
*/
public function find($collection, $query = [], $fields = [])
{
$collection = $this->db->getCollection($collection);
return $collection->find($query, $fields);
}
/**
* @param $collection
* @param array $query
* @param array $fields
* @return array
*/
public function findAll($collection, $query = [], $fields = [])
{
$cursor = $this->find($collection, $query, $fields);
$result = [];
foreach ($cursor as $data) {
$result[] = $data;
}
return $result;
}
/**
* Inserts new data into collection.
* @param string $collection name of the collection.
* @param array|object $data data to be inserted.
* @param array $options list of options in format: optionName => optionValue.
* @return \MongoId new record id instance.
* @throws Exception on failure.
*/
public function insert($collection, $data, $options = [])
{
$token = 'Inserting data into ' . $collection;
Yii::info($token, __METHOD__);
try {
Yii::beginProfile($token, __METHOD__);
$collection = $this->db->getCollection($collection);
$this->tryResultError($collection->insert($data, $options));
Yii::endProfile($token, __METHOD__);
return is_array($data) ? $data['_id'] : $data->_id;
} catch (\Exception $e) {
Yii::endProfile($token, __METHOD__);
throw new Exception($e->getMessage(), (int)$e->getCode(), $e);
}
}
/**
* Update the existing database data, otherwise insert this data
* @param string $collection name of the collection.
* @param array|object $data data to be updated/inserted.
* @param array $options list of options in format: optionName => optionValue.
* @return \MongoId updated/new record id instance.
* @throws Exception on failure.
*/
public function save($collection, $data, $options = [])
{
$token = 'Saving data into ' . $collection;
Yii::info($token, __METHOD__);
try {
Yii::beginProfile($token, __METHOD__);
$collection = $this->db->getCollection($collection);
$this->tryResultError($collection->save($data, $options));
Yii::endProfile($token, __METHOD__);
return is_array($data) ? $data['_id'] : $data->_id;
} catch (\Exception $e) {
Yii::endProfile($token, __METHOD__);
throw new Exception($e->getMessage(), (int)$e->getCode(), $e);
}
}
/**
* Removes data from the collection.
* @param string $collection name of the collection.
* @param array $criteria description of records to remove.
* @param array $options list of options in format: optionName => optionValue.
* @return boolean whether operation was successful.
* @throws Exception on failure.
*/
public function remove($collection, $criteria = [], $options = [])
{
$token = 'Removing data from ' . $collection;
Yii::info($token, __METHOD__);
try {
Yii::beginProfile($token, __METHOD__);
$collection = $this->db->getCollection($collection);
$this->tryResultError($collection->remove($criteria, $options));
Yii::endProfile($token, __METHOD__);
return true;
} catch (\Exception $e) {
Yii::endProfile($token, __METHOD__);
throw new Exception($e->getMessage(), (int)$e->getCode(), $e);
}
}
/**
* Checks if command execution result ended with an error.
* @param mixed $result raw command execution result.
* @throws Exception if an error occurred.
*/
protected function tryResultError($result)
{
if (is_array($result)) {
if (!empty($result['err'])) {
throw new Exception($result['errmsg'], (int)$result['code']);
}
} elseif (!$result) {
throw new Exception('Unknown error, use "w=1" option to enable error tracking');
}
}
}