2016-08-25 123 views
6

在以下鏈接 https://docs.mongodb.com/manual/reference/bson-types/ 它提到JavaScript與範圍是文檔中可能的數據類型。什麼是MongoDB中的「JavaScript與範圍」

我的問題是:

(1)什麼是範圍JaveScript?

(2)它是某種在MongoDB中

「內部」數據類型由「內部」,我的意思是不能被用戶使用。 我沒有找到有關此類型的任何詳細信息,但它是在上面的鏈接提到

(3)在蒙戈C驅動,我發現結構bson_value_t http://mongoc.org/libbson/1.0.0/bson_value_t.html 什麼是「scope_data」緩衝?

+0

可能重複[什麼是類型的JavaScript/javascriptwithscope的bson](http://stackoverflow.com/questions/37941368/what-is-the-use-of-type-javascript-javascriptwithscope-of- bson) –

+3

@EvanTrimboli我發現,當查找重複也。答案根本沒有幫助。 – 4castle

回答

6

不管你信不信,它可以存儲一個 「活」 的Javascript功能在MongoDB的集合:

> db.collection.insert({ name: "add1", f: (function(x) { return x + 1 }) }) 
WriteResult({ "nInserted" : 1 }) 
> db.collection.findOne({ name: "add1" }).f(123) 
124 

A 「與閉合功能」(或者更簡單地說,一個 「封閉」)是功能,其指的是存在該功能以外的變量,就像incrementX在下面的代碼片斷:

var x = 1; 
function incrementX() { x++; } 

這些功能可以被存儲在採集的MongoDB以及;他們在執行時,他們會結合蒙戈會話的範圍:

> 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)」用於關閉。


爲什麼要在MongoDB集合中存儲Javascript函數是一個很好的問題。我不確定此功能的用途是什麼;它誠實地似乎相當危險和不適合我。特別是,如果您使用的是非Javascript語言的Mongo驅動程序,那麼對它們做任何有用的操作都很困難,並且如果惡意用戶能夠注入函數,則使用數據庫中的函數會使您暴露於潛在的漏洞攻擊到你的數據庫中。如果我是你,我會假裝這個功能不存在,繼續前進。

+0

我認爲是一樣的,但如果你嘗試使用'{f:{$ type:15}}'(JS with scope)來查詢incrementX文檔,它將找不到它,但是{f:{$ type: 13}}(JS)會。 – JohnnyHK

+0

對當前環境重新確定封閉範圍似乎更加可怕。 – Bergi

+0

@Bergi確實。我特別擔心如果一個函數覆蓋像'db'這樣的全局變量會發生什麼...... – duskwuff