mongodb更新异常'文档片段太大'

时间:2015-10-09 09:11:03

标签: php windows mongodb

使用' MongoBinData'更新我的收藏记录字段,触发异常: "文档片段太大:21216456,最大值:16777216" 我找到一些关于' allowDiskUse:true'的讨论。对于汇总,但没有任何更新'。 这是PHP中代码的一部分:

try {
    $criteria = array( '_id' => $intReleaseId);
    $fileData =  file_get_contents( $_FILES[ $fileKey]["tmp_name"]);
    $mongoBinData = new MongoBinData( $fileData, MongoBinData::GENERIC)
    $docItem['data'] = $mongoBinData;
    $docItem['fileType'] = $strFileType;
    $docItem['fileSize'] = $intFileSize;
    $docItem['fileExtension'] = $strFileExtension;
    $docItem['fileName'] = $strFileName;
    $options = array( "upsert" => true, 
        'safe' => true, 'fsync' => true, 
        'allowDiskUse' => true ); // this option doesn't change anything
    $reportJson = self::GetCollection('releases')->update( $criteria, $docItem, $options);
...

MongoDb版本是db version v3.0.6

有些想法?

1 个答案:

答案 0 :(得分:0)

自我解决。 使用gridFS是即时而简单的。

$_mongo = new MongoClient();
$_db = $_mongo->selectDB($_mDbName);
$_gridFS = $_db->getGridFS();

/* */
function saveFileData($intReleaseId, $binData) {
    $criteria = array( '_id' => $intReleaseId);
    // if exist or not, remove previous value
    try {
        $_gridFS->remove( $criteria);
        }
    catch(Exception $e) {}
    // store new file content
    $storeByteCompleted = false;
    try {
        $reportId = $_gridFS->storeBytes( 
             $binData, 
             array("_id" => $intReleaseId));
        if ($reportId == $intReleaseId) {
            $storeByteCompleted = true;
            }
    catch(Exception $e) {}
    return $storeByteCompleted;
    }

function loadFileData($intReleaseId) {
    $gridfsFile = null;
    $binData = null;
    try {
        $gridfsFile = $_gridFS->get($intReleaseId);
        }
    catch(Exception $e) {}
    if ($gridfsFile != null) {
        $binData = $gridfsFile->getBytes()
        }
    return $binData;
    }

这就是全部。