2011-12-21 39 views
2

在SQL中,可以添加不在表模型中的字段並在查詢過程中呈現它們。 MongoDB能夠在模型和/或查詢中執行相同的操作嗎?MongoDB動態結果

舉例來說,有沒有「辦法」以存儲例如收集的文件:

db.example.save(
{ 
"name":"randomValue", 
"random": function(){ return Math.random() }; 
}) 

find.example.find();會導致類似的「評估」文件的結果:

{"name":"randomValue", "random":0.9879878, "_id" : { "$oid" : "4ef1d1…" }} 

(被評估的函數將被其返回值替換)

如果這隻在指定查詢中的函數時可行,該怎麼做?

+0

你需要一個隨機值*每個*一次調用find()方法,或者這只是一個例子來說明你的問題? – milan 2011-12-21 14:10:13

+0

這是一個例子,很容易在保存時設置一個值。 – 2011-12-22 08:02:44

回答

2

目前沒有辦法來動態評估或混合到記錄集的值。

正如你所說,你可以存儲函數,但你必須通過遍歷每個文檔並調用doc.random = db.eval('doc.random')來評估它們,它將用一個值替換原始函數 - 這可能不是你想要的。

您還可以將函數存儲在db.system.js中並調用它們以返回修改的數據集 - 運行db.eval確實有一些缺點,map reduce可能更適合。

退房:http://www.mongodb.org/display/DOCS/Server-side+Code+Execution

3

簡短的回答是:不,這是不可能的。

這樣的功能是'演示'層的一部分。當你在UI上顯示數據時,你通常會準備UI模型。在此步驟中,您可以調用任何函數並從客戶端語言擴展您的模型。

或者如果您需要在文檔中有一些額外的值(應由某些函數評估),您可以在保存文檔之前調用此函數。例如,shell腳本保存隨機值由Math.Randomrandom現場評價:

random = Math.random(); 
db.example.save(
{ 
    "name":"randomValue", 
    "random": random 
}) 

希望這會有所幫助。