/** * @param array $query * @param array $sort * @param null|int $limit * @param null|int $skip * @return array */ public function find(array $query = array(), array $sort = array(), $limit = null, $skip = null) { if (!Mongo::getInstance()->isAuthDisabled()) { // TODO: add support for $and and $or queries if (isset($query['className'])) { if (is_array($query['className']) && !empty($query['className']['$in'])) { $newIn = array(); foreach ($query['className']['$in'] as $className) { if (Mongo::getInstance()->getUser()->can($className, 'read')) { $newIn[] = $className; } } if (empty($newIn)) { return array(); } $query['className']['$in'] = $newIn; } elseif (is_string($query['className']) && !Mongo::getInstance()->getUser()->can($query['className'], 'read')) { return array(); } } else { $query['className'] = array('$in' => Mongo::getInstance()->getUser()->getPermissions('read')); } } $cursor = $this->_getCollection()->find($query); if (!empty($sort)) { try { $cursor->sort($sort); } catch (\Exception $e) { // continue with unsorted cursor } } if (!is_null($limit)) { $cursor->limit(intval($limit)); } if (!is_null($skip)) { $cursor->skip(intval($skip)); } $results = array(); foreach ($cursor as $r) { if (empty($r['className'])) { // TODO: logging continue; } $results[] = Mongo::factory($r['className'], $r); } return $results; }