我有一个保存在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})
在保留简单使用预建功能的能力的同时,有没有办法做到这一点?
谢谢大家的及时参与。
让我解释一下为什么我需要在MongoDB中执行此操作,并且它不是错误层的客户端逻辑问题。我真正想要做的是使用该函数来获取分片值。电子邮件只是一个例子,但实际上,我所拥有的是一个返回mod值的哈希函数。
我知道Mongo能够根据散列值进行分片,但是根据我收集的内容,它会产生一个高度随机的值,这会增加分片与不必要负载的重新平衡。所以我想像func(_id,mod)那样控制它,它会返回一个从0到1000的值(取决于mod值)。
另外,我想我也想在某种分组场景中使用该函数的输出,我想Map Reduce确实会浮现在脑海中......我只是希望避免为某些东西编写过于复杂的M / R这么简单..而且,我真的不知道如何做Map Reduce ..哈哈。
所以,我从你的答案收集到的,没有办法从mongo返回任何格式化的值(没有map / reduce),是吗?
答案 0 :(得分:1)
我认为你正在混合你的"层"这里的功能 - 数据库存储和检索数据,这就是全部。你需要做的是: *获取该数据并将光标存储在变量中 *循环光标,并为您经历的每条记录 *格式化并输出您认为合适的记录。 这有点类似于您在问题中描述的内容,但它不是MongoDB的一部分,您必须提供" formatEmail"在你的"应用层"
中运行希望有所帮助
答案 1 :(得分:0)
正如@alernerdev已经提到的,这通常不是在数据库层完成的。但是,有时在数据库中存储预先格式化的版本是可行的方法。以下是您可能希望存储额外数据的一些情况:
如果您需要以特定格式查找数据。例如,我的主要用户集合中有“username”和“usernameLowercase”字段。小写的一个是索引的,是我用于用户名查找的那个。混合大小写用于显示用户名。
如果您需要以特定格式报告大量数据。 100,000个电子邮件地址都以特定方式格式化?可能最好只在db中以这种格式存储它们。
如果您从一种格式到另一种格式的翻译计算成本很高。如果您正在处理大量记录,那么双重如此。
在这种情况下,如果您所做的只是查找或检索特定格式的电子邮件,我建议为其添加一个字段,然后将其编入索引。这样您就不需要为查找或显示执行实际的文档检索。超级快。用于电子邮件地址大小的磁盘存储空间非常便宜!