diff --git a/code/app/common.php b/code/app/common.php index 1556428..06676fe 100644 --- a/code/app/common.php +++ b/code/app/common.php @@ -827,4 +827,36 @@ namespace { { return strtoupper(str_replace('::', '@', ltrim(strrchr($strAction, "\\"), "\\"))); } + + /** + * Undocumented function + * + * @param MongoDB\BSON\UTCDateTime $mongoDate + * @param string $format + * @return string + */ + function formatMongoDate(\MongoDB\BSON\UTCDateTime $mongoDate, string $strFormat = "Y-m-d H:i:s"): string + { + $intTimestamp = (int) ((string) $mongoDate / 1000); + return gmdate($strFormat, $intTimestamp); + } + + /** + * Undocumented function + * + * @param array $arrData + * @param array $arrKeys + * @param callable $Callback + * @return void + */ + function applyToKeys(null|array &$arrData, array $arrKeys, callable $Callback) + { + if (empty($arrData)) return; + + foreach ($arrKeys as $strKey) { + if (key_exists($strKey, $arrData)) { + $arrData[$strKey] = $Callback($arrData[$strKey]); + } + } + } } diff --git a/code/app/home/controller/Novel.php b/code/app/home/controller/Novel.php index 020590a..3221e82 100644 --- a/code/app/home/controller/Novel.php +++ b/code/app/home/controller/Novel.php @@ -6,7 +6,9 @@ namespace app\home\controller; use app\home\BaseController; use app\model\CategoryModel; +use app\model\ChapterModel; use app\model\ConverterMovel; +use app\model\NovelClicksModel; use app\model\NovelModel; use storage\StorageCore; use think\facade\View; @@ -110,7 +112,6 @@ class Novel extends BaseController } // 小说状态 - // $strStatus = $Request->param('strStatus'); $arrStatus = [ 'all' => NULL, 'lianzai' => '连载中', @@ -232,83 +233,84 @@ class Novel extends BaseController } /** - * 分类 + * 分类 * + * @todo 第一版本不需要 * @param Request $Request * @param [type] $intCategoryId * @param integer $intPage * @return void */ - public function getNovelCategory(Request $Request, $intCategoryId = null, $intPage = 1) - { - $boolIsMobile = $Request->param('boolIsMobile'); - $strChannel = $Request->param('strChannel'); // 区分男生 / 女生频道 + // public function getNovelCategory(Request $Request, $intCategoryId = null, $intPage = 1) + // { + // $boolIsMobile = $Request->param('boolIsMobile'); + // $strChannel = $Request->param('strChannel'); // 区分男生 / 女生频道 - // 模拟数据-推荐等级为9的,连载的,男生频道/女生频道, 随机12个小说 - $arrRecommendSerializationNovel = [ - ['id' => 1, 'name' => '小说1', 'author' => '作者1'], - ['id' => 2, 'name' => '小说2', 'author' => '作者2'], - ['id' => 3, 'name' => '小说3', 'author' => '作者3'], - ['id' => 4, 'name' => '小说3', 'author' => '作者3'], - ['id' => 5, 'name' => '小说3', 'author' => '作者3'], - ['id' => 6, 'name' => '小说3', 'author' => '作者3'], - ['id' => 7, 'name' => '小说3', 'author' => '作者3'], - ['id' => 8, 'name' => '小说3', 'author' => '作者3'], - ['id' => 9, 'name' => '小说3', 'author' => '作者3'], - ['id' => 10, 'name' => '小说3', 'author' => '作者3'], - ['id' => 11, 'name' => '小说3', 'author' => '作者3'], - ['id' => 12, 'name' => '小说3', 'author' => '作者3'], - ]; - // 模拟数据-推荐等级为9的,完结的,男生频道/女生频道, 随机8个小说 - $arrRecommendEndNovel = [ - ['id' => 1, 'name' => '小说1', 'author' => '作者1'], - ['id' => 2, 'name' => '小说2', 'author' => '作者2'], - ['id' => 3, 'name' => '小说3', 'author' => '作者3'], - ['id' => 4, 'name' => '小说3', 'author' => '作者3'], - ['id' => 5, 'name' => '小说3', 'author' => '作者3'], - ['id' => 6, 'name' => '小说3', 'author' => '作者3'], - ['id' => 7, 'name' => '小说3', 'author' => '作者3'], - ['id' => 8, 'name' => '小说3', 'author' => '作者3'], + // // 模拟数据-推荐等级为9的,连载的,男生频道/女生频道, 随机12个小说 + // $arrRecommendSerializationNovel = [ + // ['id' => 1, 'name' => '小说1', 'author' => '作者1'], + // ['id' => 2, 'name' => '小说2', 'author' => '作者2'], + // ['id' => 3, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 4, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 5, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 6, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 7, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 8, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 9, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 10, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 11, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 12, 'name' => '小说3', 'author' => '作者3'], + // ]; + // // 模拟数据-推荐等级为9的,完结的,男生频道/女生频道, 随机8个小说 + // $arrRecommendEndNovel = [ + // ['id' => 1, 'name' => '小说1', 'author' => '作者1'], + // ['id' => 2, 'name' => '小说2', 'author' => '作者2'], + // ['id' => 3, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 4, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 5, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 6, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 7, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 8, 'name' => '小说3', 'author' => '作者3'], - ]; + // ]; - // 模拟数据-最近更新-随机50 - $arrNewsUpdateNovel = [ - ['id' => 1, 'name' => '小说1', 'author' => '作者1'], - ['id' => 2, 'name' => '小说2', 'author' => '作者2'], - ['id' => 3, 'name' => '小说3', 'author' => '作者3'], - ['id' => 4, 'name' => '小说3', 'author' => '作者3'], - ['id' => 5, 'name' => '小说3', 'author' => '作者3'], - ['id' => 6, 'name' => '小说3', 'author' => '作者3'], - ['id' => 7, 'name' => '小说3', 'author' => '作者3'], - ['id' => 8, 'name' => '小说3', 'author' => '作者3'], - ['id' => 9, 'name' => '小说3', 'author' => '作者3'], - ['id' => 10, 'name' => '小说3', 'author' => '作者3'], - ['id' => 1, 'name' => '小说1', 'author' => '作者1'], - ['id' => 2, 'name' => '小说2', 'author' => '作者2'], - ['id' => 3, 'name' => '小说3', 'author' => '作者3'], - ['id' => 4, 'name' => '小说3', 'author' => '作者3'], - ['id' => 5, 'name' => '小说3', 'author' => '作者3'], - ['id' => 6, 'name' => '小说3', 'author' => '作者3'], - ['id' => 7, 'name' => '小说3', 'author' => '作者3'], - ['id' => 8, 'name' => '小说3', 'author' => '作者3'], - ['id' => 9, 'name' => '小说3', 'author' => '作者3'], - ['id' => 10, 'name' => '小说3', 'author' => '作者3'], - ]; + // // 模拟数据-最近更新-随机50 + // $arrNewsUpdateNovel = [ + // ['id' => 1, 'name' => '小说1', 'author' => '作者1'], + // ['id' => 2, 'name' => '小说2', 'author' => '作者2'], + // ['id' => 3, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 4, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 5, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 6, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 7, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 8, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 9, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 10, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 1, 'name' => '小说1', 'author' => '作者1'], + // ['id' => 2, 'name' => '小说2', 'author' => '作者2'], + // ['id' => 3, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 4, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 5, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 6, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 7, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 8, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 9, 'name' => '小说3', 'author' => '作者3'], + // ['id' => 10, 'name' => '小说3', 'author' => '作者3'], + // ]; - View::assign([ - 'arrNewsUpdateNovel' => $arrNewsUpdateNovel, - 'arrRecommendSerializationNovel' => $arrRecommendSerializationNovel, - 'arrRecommendEndNovel' => $arrRecommendEndNovel, - 'arrAdBanner' => [], - 'strPageCode' => 'category' - ]); - if ($boolIsMobile) { - return View::fetch(); - } else { - return View::fetch('pc/getNovelCategory'); - } - } + // View::assign([ + // 'arrNewsUpdateNovel' => $arrNewsUpdateNovel, + // 'arrRecommendSerializationNovel' => $arrRecommendSerializationNovel, + // 'arrRecommendEndNovel' => $arrRecommendEndNovel, + // 'arrAdBanner' => [], + // 'strPageCode' => 'category' + // ]); + // if ($boolIsMobile) { + // return View::fetch(); + // } else { + // return View::fetch('pc/getNovelCategory'); + // } + // } /** * 小说详情 @@ -322,12 +324,29 @@ class Novel extends BaseController $boolIsMobile = $Request->param('boolIsMobile'); + $NovelModel = new NovelModel; + + $arrNovel = $NovelModel->getNovelInfo($intNId); + + $ChapterModel = new ChapterModel; + + $arrLatestChapter = $ChapterModel->getLatestChapter($intNId); + + $NovelClicksModel = new NovelClicksModel; + $arrNovelClicks = $NovelClicksModel->getStats($intNId); + + + + // echo '
';
+        // print_r($arrNovel);
+        // exit;
 
         $strNovel = '斗罗大陆';
 
         ConverterMovel::setVal("strNovelName", $strNovel);
 
 
+
         // 模拟数据-随机推荐数据10条
         $arrRecommendNovel = [
             ['id' => 1, 'name' => '小说1', 'author' => '作者1'],
@@ -343,7 +362,7 @@ class Novel extends BaseController
         // 最新章节 取最新5章节
         // 相邻推荐->关联的 kan 数据
         // 精品推荐->同分类随机10条数据
-        // 最新要点->取新意章节, 随机提取一部分内容 大概150字数
+
 
         // {strNovelName}最新章节_{strNovelName}{strNovelAuthor}_{strNovelName}全文阅读_{strSiteName}
         // {strNovelName}免费全文阅读-{strNovelName}{strNovelAuthor}-{strSiteName}
@@ -380,11 +399,9 @@ class Novel extends BaseController
     public function getNovelNewsChapter(Request $Request)
     {
 
-
         $intNId = $Request->param('n_id');
 
 
-
         $boolIsMobile = $Request->param('boolIsMobile');
 
         // 模拟数据-随机推荐数据10条
@@ -495,7 +512,7 @@ class Novel extends BaseController
 
 
 
-    // 小说章节-搜索
+    // 小说-搜索
     public function getSearchNovel(Request $Request)
     {
         $boolIsMobile = $Request->param('boolIsMobile');
@@ -526,69 +543,70 @@ class Novel extends BaseController
     /**
      * 小说章节-文章-自定义页面-列表
      *
+     * @todo 第一版本不做
      * @param Request $Request
      * @param [type] $intCategoryId
      * @param integer $intPage
      * @return void
      */
-    public function getArticleList(Request $Request, $intCategoryId = null, $intPage = 1)
-    {
-        $boolIsMobile = $Request->param('boolIsMobile');
+    // public function getArticleList(Request $Request, $intCategoryId = null, $intPage = 1)
+    // {
+    //     $boolIsMobile = $Request->param('boolIsMobile');
 
-        // 模拟数据
-        $arrNewsNovel = [
-            ['id' => 1, 'name' => '小说1', 'author' => '作者1'],
-            ['id' => 2, 'name' => '小说2', 'author' => '作者2'],
-            ['id' => 3, 'name' => '小说3', 'author' => '作者3'],
-            ['id' => 4, 'name' => '小说3', 'author' => '作者3'],
-            ['id' => 5, 'name' => '小说3', 'author' => '作者3'],
-            ['id' => 6, 'name' => '小说3', 'author' => '作者3'],
-            ['id' => 7, 'name' => '小说3', 'author' => '作者3'],
-            ['id' => 8, 'name' => '小说3', 'author' => '作者3'],
-        ];
+    //     // 模拟数据
+    //     $arrNewsNovel = [
+    //         ['id' => 1, 'name' => '小说1', 'author' => '作者1'],
+    //         ['id' => 2, 'name' => '小说2', 'author' => '作者2'],
+    //         ['id' => 3, 'name' => '小说3', 'author' => '作者3'],
+    //         ['id' => 4, 'name' => '小说3', 'author' => '作者3'],
+    //         ['id' => 5, 'name' => '小说3', 'author' => '作者3'],
+    //         ['id' => 6, 'name' => '小说3', 'author' => '作者3'],
+    //         ['id' => 7, 'name' => '小说3', 'author' => '作者3'],
+    //         ['id' => 8, 'name' => '小说3', 'author' => '作者3'],
+    //     ];
 
-        View::assign([
-            'arrNewsNovel' => $arrNewsNovel,
-            'strPageCode' => 'article'
-        ]);
-        if ($boolIsMobile) {
-            return View::fetch();
-        } else {
-            return View::fetch('pc/getArticleList');
-        }
-    }
+    //     View::assign([
+    //         'arrNewsNovel' => $arrNewsNovel,
+    //         'strPageCode' => 'article'
+    //     ]);
+    //     if ($boolIsMobile) {
+    //         return View::fetch();
+    //     } else {
+    //         return View::fetch('pc/getArticleList');
+    //     }
+    // }
 
     /**
      * 小说章节-文章-自定义页面-详情
-     *
+     * @todo 第一版本不做
      * @param Request $Request
      * @param [type] $intArticleId
      * @return void
      */
-    public function getArticleInfo(Request $Request, $intArticleId)
-    {
-        $boolIsMobile = $Request->param('boolIsMobile');
+    // public function getArticleInfo(Request $Request, $intArticleId)
+    // {
+    //     $boolIsMobile = $Request->param('boolIsMobile');
 
-        // 模拟数据
-        $arrNewsNovel = [
-            ['id' => 1, 'name' => '小说1', 'author' => '作者1'],
-            ['id' => 2, 'name' => '小说2', 'author' => '作者2'],
-            ['id' => 3, 'name' => '小说3', 'author' => '作者3'],
-            ['id' => 4, 'name' => '小说3', 'author' => '作者3'],
-            ['id' => 5, 'name' => '小说3', 'author' => '作者3'],
-            ['id' => 6, 'name' => '小说3', 'author' => '作者3'],
-            ['id' => 7, 'name' => '小说3', 'author' => '作者3'],
-            ['id' => 8, 'name' => '小说3', 'author' => '作者3'],
-        ];
+    //     // 模拟数据
+    //     $arrNewsNovel = [
+    //         ['id' => 1, 'name' => '小说1', 'author' => '作者1'],
+    //         ['id' => 2, 'name' => '小说2', 'author' => '作者2'],
+    //         ['id' => 3, 'name' => '小说3', 'author' => '作者3'],
+    //         ['id' => 4, 'name' => '小说3', 'author' => '作者3'],
+    //         ['id' => 5, 'name' => '小说3', 'author' => '作者3'],
+    //         ['id' => 6, 'name' => '小说3', 'author' => '作者3'],
+    //         ['id' => 7, 'name' => '小说3', 'author' => '作者3'],
+    //         ['id' => 8, 'name' => '小说3', 'author' => '作者3'],
+    //     ];
 
-        View::assign([
-            'arrNewsNovel' => $arrNewsNovel,
-            'strPageCode' => 'article'
-        ]);
-        if ($boolIsMobile) {
-            return View::fetch();
-        } else {
-            return View::fetch('pc/getArticleInfo');
-        }
-    }
+    //     View::assign([
+    //         'arrNewsNovel' => $arrNewsNovel,
+    //         'strPageCode' => 'article'
+    //     ]);
+    //     if ($boolIsMobile) {
+    //         return View::fetch();
+    //     } else {
+    //         return View::fetch('pc/getArticleInfo');
+    //     }
+    // }
 }
diff --git a/code/app/model/ChapterModel.php b/code/app/model/ChapterModel.php
index 403cda1..d6c8377 100644
--- a/code/app/model/ChapterModel.php
+++ b/code/app/model/ChapterModel.php
@@ -5,6 +5,7 @@ declare(strict_types=1);
 namespace app\model;
 
 use DateTime;
+use storage\StorageCore;
 use think\facade\Cache;
 use think\Model;
 
@@ -14,4 +15,76 @@ use think\Model;
 class ChapterModel extends MongoModel
 {
     protected $strCollection = 'chapter';
+
+    static public $arrChapterOptions = [
+        'typeMap' => [
+            'root' => 'array',
+            'document' => 'array',
+            'array' => 'array',
+        ],
+        'projection' => [
+            '_id' => 0,
+            'c_page_title' => 0,
+            'c_page_keywords' => 0,
+            'c_page_description' => 0,
+            'c_source_uri' => 0,
+            'c_source_id' => 0,
+            'c_site_name' => 0,
+            'c_site_code' => 0,
+            'c_site_uuid' => 0,
+
+        ],
+    ];
+
+    /**
+     * Undocumented function
+     *
+     * @param integer $intNId
+     * @return null|array
+     */
+    public function getLatestChapter(int $intNId): null|array
+    {
+        $arrFilter = ['n_id' => $intNId, 'c_page' => 0];
+
+        $arrOptions = self::$arrChapterOptions;
+
+        $arrOptions['sort'] =  ['c_sort_num' => -1];
+
+        $arrChapter =  $this->getOne($arrFilter, $arrOptions);
+
+        if (!empty($arrChapter)) {
+            applyToKeys($arrChapter, ['created_at', 'updated_at'], 'formatMongoDate');
+
+            $arrChapter['content'] = StorageCore::getInstance()->read($arrChapter['c_content_path']);
+        }
+
+
+        return  $arrChapter;
+    }
+
+    /**
+     * Undocumented function
+     *
+     * @param integer $intNId
+     * @return null|array
+     */
+    public function getChapterAll(array $arrFilter, array $arrOptions = []): null|array
+    {
+        // $arrFilter = ['n_id' => $intNId, 'c_page' => 0];
+
+        // $arrOptions = self::$arrChapterOptions;
+
+        // $arrOptions['sort'] =  ['c_sort_num' => -1];
+
+        // $arrChapter =  $this->getOne($arrFilter, $arrOptions);
+
+        // if (!empty($arrChapter)) {
+        //     applyToKeys($arrChapter, ['created_at', 'updated_at'], 'formatMongoDate');
+
+        //     $arrChapter['content'] = StorageCore::getInstance()->read($arrChapter['c_content_path']);
+        // }
+
+
+        // return  $arrChapter;
+    }
 }
diff --git a/code/app/model/MongoModel.php b/code/app/model/MongoModel.php
index d9ffaa6..bc3c6c9 100644
--- a/code/app/model/MongoModel.php
+++ b/code/app/model/MongoModel.php
@@ -7,8 +7,6 @@ namespace app\model;
 use db\mongo\MongoBase;
 use ddl\DDLManage;
 use MongoDB\Collection;
-use think\facade\Cache;
-use think\Model;
 
 /**
  * @mixin think\Model
@@ -68,4 +66,15 @@ abstract class MongoModel
     {
         return $this->strCollection;
     }
+
+    /**
+     * Undocumented function
+     *
+     * @param array $arrFilter
+     * @return array|object|null
+     */
+    public function getOne(array $arrFilter = [], array $arrOptions = []): array|object|null
+    {
+        return $this->getCol()->findOne($arrFilter, $arrOptions);
+    }
 }
diff --git a/code/app/model/NovelClicksModel.php b/code/app/model/NovelClicksModel.php
index 09c2ae8..a07f804 100644
--- a/code/app/model/NovelClicksModel.php
+++ b/code/app/model/NovelClicksModel.php
@@ -64,4 +64,40 @@ class NovelClicksModel extends MongoModel
         }
         return true;
     }
+
+    public function getStats(int $intNId): array
+    {
+        $Now = new DateTime();
+        $strDailyDate = $Now->format('Y-m-d');
+        $strWeeklyDate = $Now->modify('monday this week')->format('Y-m-d');
+        $strMonthlyDate = $Now->format('Y-m-01');
+
+        $query = [
+            'n_id' => $intNId,
+            '$or' => [
+                ['nc_type' => 'daily', 'nc_date' => $strDailyDate],
+                ['nc_type' => 'weekly', 'nc_date' => $strWeeklyDate],
+                ['nc_type' => 'monthly', 'nc_date' => $strMonthlyDate],
+                ['nc_type' => 'total', 'nc_date' => null]
+            ]
+        ];
+        $arrOptions = [
+            'projection' => ['nc_type' => 1, 'nc_clicks' => 1, '_id' => 0],
+            'typeMap' => ['root' => 'array', 'document' => 'array', 'array' => 'array']
+        ];
+
+        $arrResults = $this->getCol()->find($query, $arrOptions)->toArray();
+
+        $arrStats = array_column($arrResults, 'nc_clicks', 'nc_type');
+
+        $defaultStats = [
+            'daily' => 0,
+            'weekly' => 0,
+            'monthly' => 0,
+            'total' => 0
+        ];
+        $arrStats = array_merge($defaultStats, $arrStats);
+
+        return $arrStats;
+    }
 }
diff --git a/code/app/model/NovelModel.php b/code/app/model/NovelModel.php
index 4dc9fd2..071624c 100644
--- a/code/app/model/NovelModel.php
+++ b/code/app/model/NovelModel.php
@@ -36,7 +36,7 @@ class NovelModel extends MongoModel
 
         try {
             $arrConditions = array_map(function ($strKeyword) {
-                return ['og_title' => ['$regex' => trim($strKeyword), '$arrOptions' => 'i']];
+                return ['og_title' => ['$regex' => trim($strKeyword), '$options' => 'i']];
             }, $arrKeywords);
 
             $UpdateResult = $this->getCol()->updateMany(
@@ -53,6 +53,86 @@ class NovelModel extends MongoModel
         return true;
     }
 
+    static public $arrNovelOptions = [
+        'typeMap' => [
+            'root' => 'array',
+            'document' => 'array',
+            'array' => 'array',
+        ],
+        'projection' => [
+            '_id' => 0,
+            'og_title' => 0,
+            'n_site_name' => 0,
+            'n_site_code' => 0,
+            'n_site_uuid' => 0,
+            'n_source_id' => 0,
+            'n_page_title' => 0,
+            'og_description' => 0,
+            'og_novel_latest_chapter_name' => 0,
+            'og_image' => 0,
+            'og_novel_latest_chapter_url' => 0,
+            'og_novel_read_url' => 0,
+            'og_type' => 0,
+            'og_url' => 0,
+        ],
+    ];
+
+    /**
+     * Undocumented function
+     *
+     * @param integer $intNId
+     * @return array
+     */
+    public function getNovelInfo(int $intNId): null|array
+    {
+        $arrFilter = ['n_id' => $intNId];
+        $arrOptions = self::$arrNovelOptions;
+        $arrNovel =  $this->getOne($arrFilter, $arrOptions);
+        applyToKeys($arrNovel, ['created_at', 'updated_at'], 'formatMongoDate');
+
+
+        
+        return $arrNovel;
+    }
+
+
+    /**
+     * Undocumented function
+     *
+     * @param string $strKey
+     * @param integer $intCount
+     * @param int $intLifeTime
+     * @param array $arrFilter
+     * @return void
+     */
+    public function getRandNovel(string $strKey, $intCount = 10, int  $intLifeTime = 24 * 3600, array $arrFilter = []): array
+    {
+        try {
+
+            $arrResult = Cache::get($strKey);
+
+            // if (empty($arrResult)) {
+            if (true) {
+
+                $pipeline = [
+                    ['$match' => $arrFilter],
+                    ['$sample' => ['size' => $intCount]]
+                ];
+
+                $Novel = $this->getCol()->aggregate($pipeline);
+
+                $arrResult =  iterator_to_array($Novel);
+                if (!empty($arrResult)) {
+                    Cache::set($strKey, $arrResult, $intLifeTime);
+                }
+            }
+
+            return $arrResult;
+        } catch (\Exception $e) {
+            return [];
+        }
+    }
+
     /**
      * Undocumented function
      *