返回MongoDB中的格式化值db.collection.find()

时间:2014-11-19 20:34:13

标签: javascript mongodb

我有一个保存在db.system.js中的MongoDB JavaScript函数,我想用它来查询和生成输出数据。

我可以使用$ where子句查询函数的结果,如下所示:

db.records.find(
    {$where: "formatEmail(this.email.toString(), 'format type') == 'xxx'"},
    {email:1})

但是我无法使用它来返回投射的"电子邮件的格式化值"字段,如:

db.records.find({}, {"formatEmail(this.email.toString(), 'format type')": 1}) 

在保留简单使用预建功能的能力的同时,有没有办法做到这一点?

UPDATE:

谢谢大家的及时参与。

让我解释一下为什么我需要在MongoDB中执行此操作,并且它不是错误层的客户端逻辑问题。我真正想要做的是使用该函数来获取分片值。电子邮件只是一个例子,但实际上,我所拥有的是一个返回mod值的哈希函数。

我知道Mongo能够根据散列值进行分片,但是根据我收集的内容,它会产生一个高度随机的值,这会增加分片与不必要负载的重新平衡。所以我想像func(_id,mod)那样控制它,它会返回一个从0到1000的值(取决于mod值)。

另外,我想我也想在某种分组场景中使用该函数的输出,我想Map Reduce确实会浮现在脑海中......我只是希望避免为某些东西编写过于复杂的M / R这么简单..而且,我真的不知道如何做Map Reduce ..哈哈。

所以,我从你的答案收集到的,没有办法从mongo返回任何格式化的值(没有map / reduce),是吗?

2 个答案:

答案 0 :(得分:1)

我认为你正在混合你的"层"这里的功能 - 数据库存储和检索数据,这就是全部。你需要做的是: *获取该数据并将光标存储在变量中 *循环光标,并为您经历的每条记录 *格式化并输出您认为合适的记录。 这有点类似于您在问题中描述的内容,但它不是MongoDB的一部分,您必须提供" formatEmail"在你的"应用层"

中运行

希望有所帮助

答案 1 :(得分:0)

正如@alernerdev已经提到的,这通常不是在数据库层完成的。但是,有时在数据库中存储预先格式化的版本是可行的方法。以下是您可能希望存储额外数据的一些情况:

  • 如果您需要以特定格式查找数据。例如,我的主要用户集合中有“username”和“usernameLowercase”字段。小写的一个是索引的,是我用于用户名查找的那个。混合大小写用于显示用户名。

  • 如果您需要以特定格式报告大量数据。 100,000个电子邮件地址都以特定方式格式化?可能最好只在db中以这种格式存储它们。

  • 如果您从一种格式到另一种格式的翻译计算成本很高。如果您正在处理大量记录,那么双重如此。

在这种情况下,如果您所做的只是查找或检索特定格式的电子邮件,我建议为其添加一个字段,然后将其编入索引。这样您就不需要为查找或显示执行实际的文档检索。超级快。用于电子邮件地址大小的磁盘存储空间非常便宜!