繁体   English   中英

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

[英]Return formatted value in MongoDB db.collection.find()

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

我可以使用$ 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),对吗?

我认为您在这里混合了功能的“层”-数据库存储和检索数据,仅此而已。 您需要做的是:*获取数据并将光标存储在变量中*遍历光标,对于每条记录,您都要进行格式化*并视需要输出记录。 这有点类似于您在问题中所描述的内容,但它不是MongoDB的一部分,您必须在“应用程序层”中提供“ formatEmail”功能

希望能帮助到你

正如@alernerdev已经提到的那样,通常不会在数据库层上完成此操作。 但是,有时需要在数据库中存储预格式化的版本。 在某些情况下,您可能希望存储其他数据:

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

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

  • 如果您从一种格式转换为另一种格式在计算上是昂贵的。 令人怀疑的是,如果您要处理大量记录。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM