7

在以下链接 中https://docs.mongodb.com/manual/reference/bson-types/ 它提到 JavaScript with Scope 是文档中可能的数据类型。

我的问题是:

(1) 什么是具有作用域的 JavaScript?

(2)它是MongoDB中的某种“内部”数据类型

“内部”是指用户不能使用它。除了上面链接中提到的以外,我没有找到有关此类型的更多信息

(3) 在 mongo c 驱动程序中,我找到了 Struct bson_value_t http://mongoc.org/libbson/1.0.0/bson_value_t.html 什么是“scope_data”缓冲区?

4

1 回答 1

9

信不信由你,可以在 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 驱动程序,则很难对它们做任何有用的事情,并且如果恶意用户能够注入函数,则使用数据库中的函数会使您面临潜在的攻击进入你的数据库。如果我是你,我会假装这个功能不存在并继续前进。

于 2016-08-26T00:20:15.997 回答