導航:首頁 > 編程語言 > php7mongodb分頁

php7mongodb分頁

發布時間:2025-03-25 23:30:14

『壹』 php7 mongodb 擴展 真的很差嗎

MongoDB\Driver\Manager::executeBulkWrite
這玩意還配置了一個巨大的類庫來配合調用:就是這個:https://github.com/mongodb/mongo-php-library ,純粹是脫褲子放P,多此一舉,本來原生擴展就已經巨長、巨難用,還配一個根本沒有簡化任何代碼的庫有什麼意義?甚至於調用這個類庫比原生的名字更長、更啰嗦,而且多了一層封裝就多一次bug機會。
這個庫文件總共63個,看看,如果你隨便寫個腳本訪問一下mongodb,還得包含63個文件,我TM整個項目都沒有63個文件好不好?這些個寫慣了java的沒事就老老實實寫java,都跑來寫php,php是要解析執行的,又不像jvm那麼編譯優化執行,搞那麼多文件,不影響執行速度嗎?真是狗屎,所以完全不推薦用這個狗屎庫。
但是這個擴展最奇怪的就是文檔超級簡陋,根本不能獲得任何有價值的信息,所以只能靠摸索來了。
下面是我用到的由MongoClient遷移到MongoDB\Driver的差異點。
MongoClient插入或更新是同樣的代碼:
(new MongoClient())->{$db}->{$collection}->save($arr);
// 這個$arr數組可以直接含有 "_id" 索引來指定 mongodb文檔的_id值,就這么簡單粗暴,這才是php啊!
MongoDB\Driver,插入和更新需要區分:
$mongo = new MongoDB\Driver\Manager();
$bulk = new MongoDB\Driver\BulkWrite(['ordered' => true]);
$data = $mongo->executeQuery('db.collection', new MongoDB\Driver\Query([]), new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED))->toArray();
if (empty($data[0])) { // 確定不存在,插入
$bulk->insert($arr);
} else { // 否者更新
$bulk->update([], array('$set' => $arr)); // $arr同樣是剛才的數組
}
// 還沒完,還要執行下一步:db.collection要替換成實際的資料庫、集合名
$result = $mongo->executeBulkWrite('db.collection', $bulk, new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000));
// 返回插入或更新是否成功:
$ok = $result->getInsertedCount() || $result->getModifiedCount() ? 1 : 0;
// 真是夠了!
查詢一條記錄:
MongoClient:
(new MongoClient())->{$db}->{$collection}->findOne(['_id' => $id]);
MongoDB\Driver:
$mongo = new MongoDB\Driver\Manager();
$result = $mongo->executeQuery('db.collection', new MongoDB\Driver\Query(['_id'=>$id], []), new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED));
// 返回的$result是一個對象,需要手動轉換成數組。
查詢數量時候,需要注意:
$mongo = new MongoDB\Driver\Manager();
$cursor = $mongo-executeCommand($db, new MongoDB\Driver\Command($arr), new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY_PREFERRED));
// 這里$cursor是一個游標。需要注意$arr里的欄位:
$arr = ['count'=>$collection, 'query'=>$query]; // 這里count必須排在前面,位置反了直接報異常。
查詢結果集:
$mongo = new MongoDB\Driver\Manager();
$cursor = $mongo->executeQuery('db.collection', new MongoDB\Driver\Query($arr, $opts), new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED));
//注意,這里的 $arr和 $opts;
$arr = ['_id'=> ['$in'=> $ids] ]; // 根據id數組獲取集合
$opts = ['limit'=> $limit, 'skip'=> $skip ]; // 不推薦
// 這里在傳遞$limit和$skip的時候,最好先轉成整數,不然不生效:
$opts = ['limit'=> (int) $limit, 'skip'=> (int) $skip ]; // 推薦寫法。
// 寫到這里,讓人懷疑是不是在用php了,怎麼還需要這樣的類型轉換。字元串整數都不行!
基本就這樣,推薦自己封裝一個簡單的MongoDB\Driver,而不是使用那個巨大無比的庫、也不推薦直接用原生

『貳』 php7.1往mongodb 寫NumberLong和NumberInt怎麼處理

解決方案:可以先對數據進行轉換,轉換完後再插入到資料庫
例如:
$spec = array(
'name' => '張三',
'state' => new MongoInt32(100)
);

$spec = array(
'name' => '張三',
'state' => new MongoInt64(100) //NumberLong
)

閱讀全文

與php7mongodb分頁相關的資料

熱點內容
登錄伺服器發生錯誤怎麼回事 瀏覽:272
松下空氣能壓縮機 瀏覽:938
萬能源碼播放器 瀏覽:968
串口伺服器如何轉發 瀏覽:359
如何下載Ck電影部app 瀏覽:744
解壓文具筆袋簡單 瀏覽:288
android百度坐標轉換 瀏覽:367
文件公私鑰加密傳輸 瀏覽:665
python矩陣維度 瀏覽:927
華佗舌診源碼 瀏覽:897
解壓壓縮包有一個錯誤怎麼辦 瀏覽:966
怎麼在手機上設立文件夾 瀏覽:232
雲幫手伺服器搭建教程 瀏覽:785
惠普默認存在哪個文件夾 瀏覽:493
建立桌面圖標文件夾 瀏覽:86
python怎麼跳過異常繼續執行 瀏覽:315
單片機驅動可控硅 瀏覽:294
遼寧沈陽最新代理伺服器ip地址 瀏覽:565
如何安裝用友通伺服器 瀏覽:827
python怎麼將輸入轉為整數類型 瀏覽:608