Преобразование данных MongoDB в Find - PullRequest
3 голосов
/ 12 ноября 2011

Можно ли преобразовать возвращенные данные из запроса Find в MongoDB?

Например, у меня есть поля first и last для хранения имени и фамилии пользователя. В некоторых запросах я хочу вернуть только имя и фамилию (например, «Джо Смит» возвращается как «Джо С»). В MySQL функция SUBSTRING() может использоваться в поле в операторе SELECT.

Существуют ли в Mongo преобразования данных или строковые функции, как в SQL? Если да, можете ли вы привести пример использования? Если нет, то есть ли предложенный способ преобразования данных, помимо циклического повторения возвращаемого объекта?

Ответы [ 2 ]

3 голосов
/ 12 ноября 2011

С mongodb можно делать практически все на стороне сервера. Причина, по которой вы обычно слышите «нет», заключается в том, что вы жертвуете слишком большой скоростью, чтобы это имело смысл в обычных обстоятельствах. Одна из главных сил PyMongo, Майк Дирольф с 10gen, имеет хороший пост в блоге об использовании javascript на стороне сервера с pymongo здесь: http://dirolf.com/2010/04/05/stored-javascript-in-mongodb-and-pymongo.html. Его пример для хранения функции javascript для возврата суммы двух полей. Но вы можете легко изменить, чтобы вернуть первую букву вашего поля имени пользователя. Суть будет что-то вроде:

db.system_js.first_letter = "function (x) { return x.charAt(0); }"

Однако сначала поймите, что mongodb действительно хорош для извлечения ваших данных, но не очень хорош для их обработки. Рекомендация (см., Например, 50 советов и рекомендаций для разработчиков mongodb от Kristina Chodorow от Oreilly) состоит в том, чтобы сделать то, на что Эндрю кратко ссылался выше: создать столбец из первых букв и вернуть его вместо этого. Любая обработка может быть выполнена более эффективно в приложении.

Но если вы чувствуете, что даже запрос полного имени перед возвратом полного имени [0] из вашего «представления» представляет слишком большую угрозу безопасности, вам не нужно делать все как можно быстрее. Я некоторое время избегал уменьшения карты в mongodb из-за беспокойства общественности о скорости. Затем я запустил свою первую карту «Уменьшить» и перевернул большие пальцы в течение 0,1 секунды, поскольку она обработала 80 000 документов по 10 000 штук. Я понимаю в схеме вещей, это крошечный. Но это свидетельствует о том, что если для огромного веб-сайта это плохо сказывается на производительности при обработке на стороне сервера, это не значит, что это будет иметь для вас значение. В моем случае, я полагаю, что мне понадобится немного больше времени, чтобы перейти на Hadoop, чем просто есть эти 0,1 секунды время от времени. Удачи с вашим сайтом

0 голосов
/ 12 ноября 2011

Вопрос, который вы должны задать себе, - зачем вам эти данные? Если вам это нужно для демонстрации, сделайте это в коде вашего представления. Если вам это нужно для запросов, сделайте, как предложил Эндрю, и сохраните его как дополнительное поле на объекте. Mongo не предоставляет трансформации на стороне сервера (обычно, и там, где это происходит, вы обычно не хотите их использовать); обычно ответ заключается не в том, чтобы обрабатывать ваши данные так, как в реляционной БД, а в том, чтобы использовать более гибкий характер хранилища данных для предварительной обработки данных в форматах, которые вы собираетесь использовать.

Если вы можете предоставить больше информации о том, как использовать эти данные, то мы могли бы ответить немного более полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...