2016-03-03 3 views
0

У меня есть база данных mongodb, которая содержит записи доменов, и целое число «хитов» каждого из них было замечено.Обработка Mongodb в хранимых процедурах - BSON to JSON в javascript

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 против JSON

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

Я не могу получить значение «хиты», где я могу его использовать.

Я могу сделать это тривиально в Python с Pymongo, но не в оболочке mongo, ни в javascript.

Я хочу, чтобы хранимые процедуры javascript могли извлекать значения из db и обрабатывать их , наконец, возвращая результат. Но я не могу добраться до фактического значения (в этом случае число ударов) . Кто угодно?

+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