【发布时间】:2013-11-26 11:45:44
【问题描述】:
我正在将底层数据库从关系数据库更改为 MongoDB,我需要通过 MongoDB 查询“重新创建”相同的语义。总而言之,这一切都很好,除了一件事:SQL best() 函数:
SELECT * FROM my_table
WHERE (GREATEST(FIELD_A, FIELD_B, FIELD_C, FIELD_D)
BETWEEN some_value AND some_value)
AND FIELD_E = another_value;
我似乎找不到这个 GREATEST() 函数的等价物。我知道可以通过使用 $cond 运算符来实现一些类似的功能,但是由于这里的 GREATEST() 函数正在寻找 4 个值中的最大值,这将是很多条件。有没有其他方法可以实现这一目标?我已经查看了聚合框架和 mapReduce,但我似乎无法在聚合框架中找到任何直接相似的东西,而且我很难理解 mapReduce 框架。
这甚至有可能实现吗?我会假设答案是肯定的,但我似乎真的找不到合理的等效方法。
【问题讨论】:
-
需要注意的是greater不是SQL算子而是oracle算子,不是标准的
-
@Sammaye 你在这里绝对正确。然而,即使 best() 不是标准的一部分,关系型数据库也很普遍地支持它(oracle、mysql、postgresql、sqlite(尽管名称为 MAX))。
-
两者并不完全相同,但是获得最大值的一种简单方法是在字段上对结果 DESC 进行排序
-
您想要所有字段的事实使得聚合框架难以适应。特别是当您的查询并没有真正聚合时。 MapReduce 也会很麻烦。
-
MongoDb 的方式可能是在文档存储时预先计算“最大”值,而不是稍后在查询时。
标签: sql mongodb mongodb-java