2011-11-11 18 views
2

是否可以转换MongoDB中查找查询返回的数据?在查找时转换MongoDB数据

作为一个例子,我有一个firstlast字段来存储用户的名和姓。在某些查询中,我希望仅返回名字和最后的首字母(例如'Joe Smith'返回为'Joe S')。在MySQL中,可以在SELECT语句的字段中使用SUBSTRING()函数。

在Mongo中是否有像SQL中的数据转换或字符串函数?如果可以,请提供使用示例。如果没有,是否有一种将数据转换为循环返回对象的方法?

回答

3

在MongoDB的服务器端可以做任何事情。你通常会听到“不”的原因是你在普通情况下牺牲了太多速度让它变得有意义。 PyMongo背后的主要力量之一,10gen的Mike Dirolf在这里使用服务器端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是做成在检索数据,在处理这不是真的很好真的很不错。这个建议(参见例如Oreilly的Kristina Chodorow的mongodb开发人员的50个技巧和窍门)就是完成Andrew特意提到的上述操作:创建第一个字母列并返回。任何处理都可以在应用程序中更高效地完成。

但是,如果您觉得在从'视图'返回完整名称[0]之前查询完整名称会带来太多的安全风险,则不需要尽可能以最快的方式完成所有操作。由于所有公众对速度的担忧,我暂时避免在MongoDB中使用map-reduce。然后我跑了我的第一张地图缩小版,把我的拇指旋转了0.1秒,因为它处理了80,000个10k文件。我在事情的计划中意识到,那很微小。但它说明,仅仅因为一个庞大的网站在某些服务器端处理上的性能受到影响是不利的,并不意味着它对您而言就很重要。在我的例子中,我想我需要花一点时间才能迁移到Hadoop,而不是每隔一段时间就吃那个.1秒。祝您网站好运

+0

此外,我发现使用MongooseJS我可以使用“虚拟”来完成此操作。如:schUsers.virtual('lastInitial')。get(function(){return this.last。SUBSTR(0,1);});我不确定这是什么转化为MongoDb Code,或者它是否完全由Mongoose处理。 –

0

你应该问自己的问题是为什么你需要这些数据。如果您需要将其用于显示目的,请在视图代码中执行此操作。如果您需要查询,请按照Andrew的建议进行操作,并将其作为额外的字段存储在对象上。 Mongo不提供服务器端转换(通常,它在哪里,通常不想使用它们);答案通常不是像在关系数据库中那样对待数据,而是使用数据存储的更加灵活的特性将数据预先烧制成您将要使用的格式。

如果您可以提供有关如何使用这些数据的更多信息,那么我们可能会更有用地回答一些问题。

+0

该数据集用于Web服务。根据请求者的权限,他们没有权限查看用户的全名,在这种情况下,只返回第一个首字母。显然,这不允许在视图层上进行转换。我可以创建另一个字段,但它看起来很愚蠢,因为我不需要查询这样的字段。 –

+0

为什么你不能在视图上做到这一点?这似乎是根据查看用户的权限决定要呈现什么的正确位置。 –