文档菜单
文档首页
/
MongoDB 手册

在服务器上存储 JavaScript 函数

本页内容

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

重要

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

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

此任务使用的是传统mongo 命令行工具从 system.js 集合加载服务器端函数。这个版本的命令行工具已不再受支持。有关 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 (with scope) 保存的函数,不能由 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?