信不信由你,可以在 MongoDB 集合中存储“实时”Javascript 函数:
> db.collection.insert({ name: "add1", f: (function(x) { return x + 1 }) })
WriteResult({ "nInserted" : 1 })
> db.collection.findOne({ name: "add1" }).f(123)
124
“带闭包的函数”(或更简单地说,“闭包”)是一个函数,它指代存在于函数外部的变量,如incrementX
以下代码段所示:
var x = 1;
function incrementX() { x++; }
这些函数也可以存储在 MongoDB 集合中;它们在执行时将绑定到 mongo 会话的范围:
> db.collection.insert({
name: "incrementX",
f: (function() { x++; })
})
WriteResult({ "nInserted" : 1 })
> var x = 123;
> db.collection.findOne({ name: "incrementX" }).f()
> x
124
由于一些不可知的原因,BSON 设计者决定为 Javascript 函数使用不同的数据类型,具体取决于它们是否对任何变量关闭。普通的“Javascript”类型用于不关闭任何变量的函数,“Javascript (with scope)”用于闭包。
为什么要将 Javascript 函数存储在 MongoDB 集合中是……一个好问题。我不确定这个功能的目的是什么;老实说,这对我来说似乎相当危险和不明智。特别是,如果您使用非 Javascript 语言的 Mongo 驱动程序,则很难对它们做任何有用的事情,并且如果恶意用户能够注入函数,则使用数据库中的函数会使您面临潜在的攻击进入你的数据库。如果我是你,我会假装这个功能不存在并继续前进。