Обработка MongoDB в хранимых процедурах — BSON в JSON в javascript

У меня есть база данных mongodb, которая содержит записи доменов и целое число просмотренных «попаданий».

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

Я хочу написать несколько хранимых процедур mongodb для обработки этих записей на сервере. MongoDb может хранить процедуры в javascript.

Я хочу (чтобы привести тривиальный пример) получить совокупность количества обращений для двух доменов. В Python/pymongo я могу сделать это легко — я могу получить db.find({"dom": "domainname.com"}) записи для двух доменов, проанализировать возвращенную запись как JSON, извлечь номера обращений и добавить их.

Однако я не могу сделать то же самое в javascript. Часть проблемы, по-видимому, заключается в том, что find возвращает 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 могли извлекать значения из базы данных и обрабатывать их, наконец, возвращая результат. Но я не могу получить фактическое значение (в данном случае число попаданий), чтобы сделать это. Кто угодно?


person user3587642    schedule 03.03.2016    source источник
comment
mongodb не поддерживает хранимые процедуры. Я предлагаю уточнить ваш вопрос с некоторыми образцами документов mongodb. Также опубликуйте, что вы ожидаете от действия, которое пытаетесь выполнить.   -  person Saleem    schedule 04.03.2016


Ответы (1)


Я думаю, что агрегация MongoDB может быть тем, что вам нужно.

Вы бы сделали что-то вроде этого:

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

Приведенное выше — всего лишь простой пример, и я не знаю точной структуры всех ваших данных, поэтому вам, возможно, придется немного изменить ее. Документы MongoDB предоставляют отличный агрегированный пример, связанный с почтовые индексы и население города:

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.

person Josh Beam    schedule 03.03.2016
comment
Рад, что кто-то упомянул простые старые объекты JavaScript. Вся эта штука с JSON/BSON становится преувеличенной, где часто (не всегда) дело в том, что людям нужно заботиться только о собственной реализации объекта языка, который они используют. Или для большинства строго типизированных языков, в которых этого нет, формат объекта, возвращаемый и поддерживаемый драйвером. Также спасибо за то, что увидели вопрос в вопросе и предоставили что-то, что решает его. - person Blakes Seven; 04.03.2016
comment
@BlakesSeven да, в большинстве случаев разработчики никогда не должны беспокоиться о BSON/JSON. Драйверы/библиотеки обычно обрабатывают этот уровень абстракции. - person Josh Beam; 04.03.2016
comment
Спасибо, Джош, но я думаю, что мне нужно уточнить - «добавить значения совпадений» было приведено в качестве очень простого примера. я хочу создать довольно сложную функциональность на стороне сервера, выходящую далеко за рамки встроенных функций MongoDB. Я рассмотрю другие предложения. - person user3587642; 04.03.2016