2016-03-03 45 views
0

我有一個mongodb數據庫,其中包含域的記錄,以及每個已經看到的「點擊數」的整數。在存儲過程中的Mongodb處理 - 在JavaScript中的BSON到JSON

record = 
{ 
"dom" : "Somedomain.com", 
"hits" : 23 
} 

我想寫一些mongodb存儲過程來處理服務器上的這些記錄。 MongoDb可以在JavaScript中存儲過程。

我想(給一個簡單的例子)得到兩個域的點擊數的聚合。在Python/pymongo中,我可以很輕鬆地做到這一點 - 我可以獲取db.find({「dom」:「domainname.com」))這兩個域的記錄,將返回的記錄解析爲JSON,提取命中數字,然後添加它們。

但是,我似乎無法在JavaScript中做同樣的事情。部分問題似乎是找到返回BSON,而不是JSON,似乎沒有原生的方式來轉換它。

> This is in the Mongo Shell, which is mostly javascript. 

> var r = db.test_collection.find({dom:"somedomain.com"},{hits:true,_id:false}) 
> r 
{ "hits" : 1043 } 
> var j = JSON.parse(r) 
2016-03-03T17:27:52.046-0500 SyntaxError: Unexpected token D 

> var r = db.test_collection.find({dom:"somedomain.com"},{hits:true,_id:false}).valueOf() 
> r 
{ "hits" : 1043 } 
> var j = JSON.parse(r) 
2016-03-03T17:27:52.046-0500 SyntaxError: Unexpected token D 

這種「的SyntaxError」的來源似乎是BSON VS JSON

> var r = db.test_collection.find({dom:"somedomain.com"},{hits:true,_id:false}).valueOf() 
> r.hits 
> 

我不能讓「命中」價值在哪裏我可以用它。

我可以用Pymongo在Python中輕鬆地做到這一點,但不是在mongo shell中,也不在javascript中。

我想存儲的JavaScript程序能夠從數據庫檢索值,並處理 他們,最後返回一個結果。但我無法得到實際的價值(在這種情況下命中數) 這樣做。任何人?

+0

mongodb不支持存儲過程。我會建議用一些示例mongodb文檔來詳細說明你的問題。同時發佈您期望從您正在嘗試執行的操作 – Saleem

回答

1

我認爲MongoDB aggregation可能是你要找的。

你會做這樣的事情:

db.test_collection.aggregate([ 
    { $group: { _id: "$dom", total: { $sum: "$hits" } } }, 
    { $match: { dom: { $or: ['somedomain.com', 'anotherdomain.com'] } } } 
]) 

以上僅僅是一個簡單的例子,我不知道您的所有數據的確切結構,所以你可能需要調整有點。 MongoDB的文檔提供與郵編和城市的人口大聚集example

db.zipcodes.aggregate([ 
    { $group: { _id: { state: "$state", city: "$city" }, pop: { $sum: "$pop" } } }, 
    { $group: { _id: "$_id.state", avgCityPop: { $avg: "$pop" } } } 
]) 

而且,記住,你不應該做var j = JSON.parse(r)。 MongoDB查詢返回普通的舊JavaScript對象。

+0

很高興有人提到了*「普通的舊JavaScript對象」*。整個JSON/BSON的東西都過分了,「經常」(並非總是)的情況是,人們只需要關心他們正在使用的語言的本地「對象」實現。或者對於大多數強類型的語言來說,驅動程序返回並支持的對象格式。也可以看到問題中的問題並提供解決問題的方法。 –

+1

@BlakesSeven在大多數情況下,開發者絕對不應該關心BSON/JSON。驅動程序/庫通常處理這個抽象層。 –

+0

感謝喬希,但我想我需要澄清 - '添加命中值'只是一個非常簡單的例子。我想創建一些相當複雜的服務器端功能,遠遠超出了MongoDB的內置功能。我會研究其他建議。 – user3587642