2016-08-31 32 views
1

我已經編寫了一個在Mongo服務器上運行的JavaScript代碼(用於更精細的編輯目的)。它在mongo shell中運行良好,問題是如何在PHP上運行它?如何在PHP中的Mongo Server上運行Javascript代碼?

我正在使用Mongo 3.2和php.net表示​​功能的PHP驅動程序正在被棄用。我似乎無法找到有關此主題的最新信息。

回答

1

execute僅僅是mongo eval命令的封裝,自3.0+以來已經降級,因此有很多eval問題,因爲它被取消了。

  1. 兼容性:eval是在引入分片之前開發的。 eval命令根本不適用於分片羣集。
  2. 性能:默認情況下爲全局鎖定。如果eval使用noLock選項,則意味着JavaScript可以輕鬆地從客戶端程序運行。

  3. 安全性:您必須有權訪問所有資源上的所有操作才能運行eval。安全最佳實踐取決於能夠將特權分割爲行動,並且eval提供的權限範圍太廣泛。

  4. 維護:由於多種原因,服務器必須移至執行「out of process」的JavaScript模型;維持對eval的支持使得這非常困難。

我不這麼認爲,你將能夠通過exeute PHP驅動程序這段JavaScript代碼爲現在蒙戈3.2+

https://jira.mongodb.org/browse/SERVER-17453

0

假設$m握着你的蒙戈客戶端對象:

 $eval = ' 
db.getCollection("myCollectionName").insertMany([ 
    { 
     "key" : "I_am_a_key", 
     "updatedAt" : ISODate("2017-03-24T04:13:57.000Z") 
    }, 
    { 
     "doc2" : "haha" 
    } 
]); 
'; 
     $results = $m->command(['eval' => $eval]); 
     foreach ($results as $result) { 
      echo PHP_EOL; 
      print_r($result); 
      // outputs part 1 
     } 

     $eval = ' 
db.getCollection("myCollectionName").insert([ 
    { 
     "simple" : "yes" 
    } 
]); 
'; 
     $results = $m->command(['eval' => $eval]); 
     foreach ($results as $result) { 
      echo PHP_EOL; 
      print_r($result); 
      // outputs part 2 
     } 
  1. 確保您的mongodb實例具有適當的權限t o運行eval命令。順便說一下eval命令已被棄用。
  2. 訪問$輸出(例如傾銷)可能導致分段錯誤錯誤。如果您正在使用SELinux的,這需要 服務器端JavaScript將導致段錯誤的錯誤任何MongoDB的操作

注:https://docs.mongodb.com/manual/core/server-side-javascript/ seggusts它是與SELinux的(它沒有幫助我,雖然)。禁用 JavaScript的服務器端執行描述瞭如何禁用服務器端JavaScript的執行 。

  • $輸出將是MongoDB\Driver\Cursor類型和此Traversable的對象的結構的是主叫insertinserMany或等。輸出提供的腳本時極其不同:

    /* 
    // output part 1 
    Array 
    (
        [retval] => Array 
         (
          [acknowledged] => 1 
          [insertedIds] => Array 
           (
            [0] => MongoDB\BSON\ObjectID Object 
             (
              [oid] => 592632451469665d3df5a760 
             ) 
    
            [1] => MongoDB\BSON\ObjectID Object 
             (
              [oid] => 592632451469665d3df5a761 
             ) 
    
           ) 
    
         ) 
    
        [ok] => 1 
    ) 
    // output part 2 
    Array 
    (
        [retval] => Array 
         (
          [nInserted] => 1 
          [nUpserted] => 0 
          [nMatched] => 0 
          [nModified] => 0 
          [nRemoved] => 0 
          [getUpsertedIds] => MongoDB\BSON\Javascript Object 
           (
            [code] => function() { 
          return bulkResult.upserted; 
         } 
            [scope] => 
           ) 
    
          [getUpsertedIdAt] => MongoDB\BSON\Javascript Object 
           (
            [code] => function (index) { 
          return bulkResult.upserted[index]; 
         } 
            [scope] => 
           ) 
    
          [getRawResponse] => MongoDB\BSON\Javascript Object 
           (
            [code] => function() { 
          return bulkResult; 
         } 
            [scope] => 
           ) 
    
          [hasWriteErrors] => MongoDB\BSON\Javascript Object 
           (
            [code] => function() { 
          return bulkResult.writeErrors.length > 0; 
         } 
            [scope] => 
           ) 
    
          [getWriteErrorCount] => MongoDB\BSON\Javascript Object 
           (
            [code] => function() { 
          return bulkResult.writeErrors.length; 
         } 
            [scope] => 
           ) 
    
          [getWriteErrorAt] => MongoDB\BSON\Javascript Object 
           (
            [code] => function (index) { 
          if (index < bulkResult.writeErrors.length) { 
           return bulkResult.writeErrors[index]; 
          } 
          return null; 
         } 
            [scope] => 
           ) 
    
          [getWriteErrors] => MongoDB\BSON\Javascript Object 
           (
            [code] => function() { 
          return bulkResult.writeErrors; 
         } 
            [scope] => 
           ) 
    
          [hasWriteConcernError] => MongoDB\BSON\Javascript Object 
           (
            [code] => function() { 
          return bulkResult.writeConcernErrors.length > 0; 
         } 
            [scope] => 
           ) 
    
          [getWriteConcernError] => MongoDB\BSON\Javascript Object 
           (
            [code] => function() { 
          if (bulkResult.writeConcernErrors.length == 0) { 
           return null; 
          } else if (bulkResult.writeConcernErrors.length == 1) { 
           // Return the error 
           return bulkResult.writeConcernErrors[0]; 
          } else { 
           // Combine the errors 
           var errmsg = ""; 
           for (var i = 0; i < bulkResult.writeConcernErrors.length; i++) { 
            var err = bulkResult.writeConcernErrors[i]; 
            errmsg = errmsg + err.errmsg; 
            // TODO: Something better 
            if (i != bulkResult.writeConcernErrors.length - 1) { 
             errmsg = errmsg + " and "; 
            } 
           } 
    
           return new WriteConcernError({errmsg: errmsg, code: WRITE_CONCERN_FAILED}); 
          } 
         } 
            [scope] => 
           ) 
    
          [tojson] => MongoDB\BSON\Javascript Object 
           (
            [code] => function (indent, nolint) { 
          return tojson(bulkResult, indent, nolint); 
         } 
            [scope] => 
           ) 
    
          [toString] => MongoDB\BSON\Javascript Object 
           (
            [code] => function() { 
          // Suppress all output for the write concern w:0, since the client doesn't care. 
          if (writeConcern && writeConcern.w == 0) { 
           return "BulkWriteResult(" + tojson({}) + ")"; 
          } 
          return "BulkWriteResult(" + this.tojson() + ")"; 
         } 
            [scope] => 
           ) 
    
          [shellPrint] => MongoDB\BSON\Javascript Object 
           (
            [code] => function() { 
          return this.toString(); 
         } 
            [scope] => 
           ) 
    
          [hasErrors] => MongoDB\BSON\Javascript Object 
           (
            [code] => function() { 
          return this.hasWriteErrors() || this.hasWriteConcernError(); 
         } 
            [scope] => 
           ) 
    
          [toError] => MongoDB\BSON\Javascript Object 
           (
            [code] => function() { 
          if (this.hasErrors()) { 
           // Create a combined error message 
           var message = ""; 
           var numWriteErrors = this.getWriteErrorCount(); 
           if (numWriteErrors == 1) { 
            message += "write error at item " + this.getWriteErrors()[0].index; 
           } else if (numWriteErrors > 1) { 
            message += numWriteErrors + " write errors"; 
           } 
    
           var hasWCError = this.hasWriteConcernError(); 
           if (numWriteErrors > 0 && hasWCError) { 
            message += " and "; 
           } 
    
           if (hasWCError) { 
            message += "problem enforcing write concern"; 
           } 
           message += " in bulk operation"; 
    
           return new BulkWriteError(bulkResult, singleBatchType, writeConcern, message); 
          } else { 
           throw Error("batch was successful, cannot create BulkWriteError"); 
          } 
         } 
            [scope] => 
           ) 
    
          [toSingleResult] => MongoDB\BSON\Javascript Object 
           (
            [code] => function() { 
          if (singleBatchType == null) 
           throw Error("Cannot output single WriteResult from multiple batch result"); 
          return new WriteResult(bulkResult, singleBatchType, writeConcern); 
         } 
            [scope] => 
           ) 
    
         ) 
    
        [ok] => 1 
    )