我已經編寫了一個在Mongo服務器上運行的JavaScript代碼(用於更精細的編輯目的)。它在mongo shell中運行良好,問題是如何在PHP上運行它?如何在PHP中的Mongo Server上運行Javascript代碼?
我正在使用Mongo 3.2和php.net表示功能的PHP驅動程序正在被棄用。我似乎無法找到有關此主題的最新信息。
我已經編寫了一個在Mongo服務器上運行的JavaScript代碼(用於更精細的編輯目的)。它在mongo shell中運行良好,問題是如何在PHP上運行它?如何在PHP中的Mongo Server上運行Javascript代碼?
我正在使用Mongo 3.2和php.net表示功能的PHP驅動程序正在被棄用。我似乎無法找到有關此主題的最新信息。
execute僅僅是mongo eval
命令的封裝,自3.0+以來已經降級,因此有很多eval問題,因爲它被取消了。
性能:默認情況下爲全局鎖定。如果eval使用noLock選項,則意味着JavaScript可以輕鬆地從客戶端程序運行。
安全性:您必須有權訪問所有資源上的所有操作才能運行eval。安全最佳實踐取決於能夠將特權分割爲行動,並且eval提供的權限範圍太廣泛。
維護:由於多種原因,服務器必須移至執行「out of process」的JavaScript模型;維持對eval的支持使得這非常困難。
我不這麼認爲,你將能夠通過exeute PHP驅動程序這段JavaScript代碼爲現在蒙戈3.2+
假設$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
}
eval
命令。順便說一下eval
命令已被棄用。注:https://docs.mongodb.com/manual/core/server-side-javascript/ seggusts它是與SELinux的(它沒有幫助我,雖然)。禁用 JavaScript的服務器端執行描述瞭如何禁用服務器端JavaScript的執行 。
$輸出將是MongoDB\Driver\Cursor
類型和此Traversable的對象的結構的是主叫insert
,inserMany
或等。輸出提供的腳本時極其不同:
/*
// 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
)