Docs 菜单
Docs 主页
/
MongoDB Manual

在服务器上存储 JavaScript 函数

在此页面上

  • 开始之前
  • 关于此任务
  • 步骤

重要

从MongoDB 8.0开始,服务器端JavaScript已弃用。 system.js功能可能不适用于所有特征。

一个名为 system.js 的特殊系统集合可以存储 JavaScript 函数,以供重复使用。

此任务使用旧式 mongo shell 从system.js集合中加载服务器端函数。 不再支持此版本的shell。有关 MongoDB Shell 的其他解决方案,请参阅 编写脚本。

使用 system.js 时请考虑以下事项:

  • 请勿在数据库中存储应用程序逻辑。

  • 在 MongoDB 中运行 JavaScript 会受到性能限制。

  • 当应用程序代码与应用程序本身共享版本控制时,通常也是最有效的。

要存储函数,请将函数插入system.js集合,如以下示例所示:

1
db.test_numbers.insertMany([
{ value: 1 },
{ value: 2 },
{ value: 3 },
{ value: 4 },
{ value: 5 },
{ value: 6 }
])
2

要将 JavaScript 函数存储在数据库中,请插入包含以下字段的文档:

  • _id 字段包含函数名称,在每个数据库中都是唯一的。

  • value 字段保存函数定义。

以下示例在 system.js 集合中创建了一个 echo 函数:

db.system.js.insertOne(
{
_id: "echo",
value : function(x) { return x; }
}
)

以下示例在 system.js 集合中创建了一个 isEven 函数:

db.system.js.insertOne(
{
_id: "isEven",
value: function (num) {
return num % 2 === 0;
}
}
)

这些函数保存为 BSON 类型,可用于任何 JavaScript 上下文,如 mapReduce$where

注意

保存为已弃用的 BSON 类型 JavaScript(带作用域) 的函数不能被mapReduce$where 使用。

3
db.loadServerScripts()
4
  1. 以下代码示例运行存储在 system.js 中的 echo 函数:

    echo("test")
    test
  2. 以下代码示例在test_numbers集合上运行$where操作符中system.js中存储的isEven函数:

    db.test_numbers.find({
    $where: function () {
    return isEven(this.value);
    }
    })
    { "_id" : ObjectId("668d7be41b55bec1bf191499"), "value" : 2 }
    { "_id" : ObjectId("668d7be41b55bec1bf19149b"), "value" : 4 }
    { "_id" : ObjectId("668d7be41b55bec1bf19149d"), "value" : 6 }

来年

MongoDB 是什么?