2011-11-11 2 views
2

Est-il possible de transformer les données renvoyées à partir d'une requête de recherche dans MongoDB?Transformer les données MongoDB sur Rechercher

À titre d'exemple, j'ai un champ first et last pour stocker le prénom et le nom d'un utilisateur. Dans certaines requêtes, je souhaite retourner le prénom et la dernière initiale seulement (par exemple, «Joe Smith» est retourné comme «Joe S»). Dans MySQL, une fonction SUBSTRING() peut être utilisée sur le champ dans l'instruction SELECT.

Existe-t-il des transformations de données ou des fonctions de chaînes dans Mongo comme dans SQL? Si oui, veuillez fournir un exemple d'utilisation. Si non, existe-t-il une méthode proposée pour transformer les données en dehors de la boucle à travers l'objet retourné?

Répondre

3

Il est possible de faire à peu près tout ce qui est côté serveur avec mongodb. La raison pour laquelle vous entendez habituellement «non» est que vous sacrifiez trop de vitesse pour que cela ait du sens dans des circonstances ordinaires. L'un des principaux acteurs derrière PyMongo, Mike Dirolf avec 10gen, a un bon article de blog sur l'utilisation de javascript côté serveur avec pymongo ici: http://dirolf.com/2010/04/05/stored-javascript-in-mongodb-and-pymongo.html. Son exemple est pour stocker une fonction javascript pour retourner la somme de deux champs. Mais vous pouvez facilement modifier pour retourner la première lettre de votre champ de nom d'utilisateur. L'essentiel serait quelque chose comme:

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

d'abord comprendre, cependant, que MongoDB est fait pour être vraiment bon à récupérer vos données, pas vraiment bon traiter. La recommandation (voir par exemple 50 trucs et astuces pour les développeurs mongodb de Kristina Chodorow par Oreilly) est de faire ce qu'Andrew a fait allusion à faire ci-dessus: faites une colonne de première lettre et revenez à la place. Tout traitement peut être effectué plus efficacement dans l'application. Mais si vous pensez que même demander le nom complet avant de renvoyer le nom complet [0] à partir de votre 'vue' présente un trop grand risque de sécurité, vous n'avez pas besoin de tout faire le plus rapidement possible. J'avais évité la carte-réduire en mongodb pendant un certain temps en raison de toutes les inquiétudes du public au sujet de la vitesse. Ensuite, j'ai couru ma première carte réduire et twittled mes pouces pendant .1 secondes comme il a traité 80 000 documents 10k. Je réalise dans le schéma des choses, c'est minuscule. Mais cela montre bien que ce n'est pas grave pour un site Web massif d'avoir un impact sur les performances sur un traitement côté serveur, cela ne veut pas dire que cela aurait de l'importance pour vous. Dans mon cas, j'imagine que ça me prendrait un peu plus de temps pour migrer vers Hadoop que de manger juste ce 0,1 seconde de temps en temps. Bonne chance avec votre site

+0

En outre, j'ai trouvé en utilisant MongooseJS je peux accomplir cela en utilisant un "virtuel". Tels que: schUsers.virtual ('lastInitial'). Get (function() {return this.last.substr (0,1);}); Je ne suis pas sûr de ce que cela se traduit par Code MongoDb, ou si elle est entièrement traitée par Mongoose. –

0

La question que vous devez vous poser, c'est pourquoi vous avez besoin de ces données. Si vous en avez besoin à des fins d'affichage, faites-le dans votre code d'affichage. Si vous en avez besoin à des fins de requête, faites comme Andrew suggéré, et stockez-le comme un champ supplémentaire sur l'objet. Mongo ne fournit pas de transformations côté serveur (généralement, et dans ce cas, vous ne voulez généralement pas les utiliser); la réponse est généralement de ne pas traiter vos données comme vous le feriez dans une base de données relationnelle, mais d'utiliser la nature plus flexible du magasin de données pour précuire vos données dans les formats que vous allez utiliser.

Si vous pouvez fournir plus d'informations sur la façon dont ces données devraient être utilisées, alors nous pourrions être en mesure de répondre un peu plus utilement.

+0

L'ensemble de données est utilisé pour un service Web. Selon les autorisations du demandeur, ils n'ont pas accès à l'affichage du nom de famille complet d'un utilisateur, et dans ce scénario, seule la première initiale est renvoyée. Cela, évidemment, ne permet pas de transformation sur la couche de vue. Je pourrais créer un autre domaine, mais cela me semble idiot car je n'ai pas besoin d'interroger un tel domaine. –

+0

Pourquoi ne pouvez-vous pas le faire sur la vue? Cela semble être le bon endroit pour décider quoi rendre en fonction des permissions de l'utilisateur. –

Questions connexes