我正在将底层数据库从关系数据库更改为MongoDB,我需要通过MongoDB查询“重新创建”相同的语义。总而言之,这很好,除了一件事:SQL great()函数:
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框架。
这甚至可以实现吗?我认为答案是肯定的,但我似乎无法找到合理的方法来做到这一点。
答案 0 :(得分:1)
如果您查询引用的是您要复制的内容,则可以采用不同的路线...
您希望查找范围(加上其他条件)中最大4个值的所有文档。
您可以将其改为所有4个值均低于上限且至少有一个高于下限的文档。 有点像:
find(
{field_a:{$lt:some_upper_limit}
,field_b:{$lt:some_upper_limit}
,field_c:{$lt:some_upper_limit}
,field_d:{$lt:some_upper_limit}
,$or:
[{field_a:{$gt:some_lower_limit}}
,{field_b:{$gt:some_lower_limit}}
,{field_c:{$gt:some_lower_limit}}
,{field_d:{$gt:some_lower_limit}}
]
})
根据数据等,看看索引如何帮助提高效率可能是一个好主意......
答案 1 :(得分:-2)
MongoDb目前不具有与GREATEST
功能相同的功能。您可以使用MapReduce,但它不会提供有效的即时结果。此外,您无法有效地返回文档的其他字段。您需要执行多个查询,或者可能复制所有数据。而且,如果不对结果进行更新,则不会修改文档,因为必须手动启动MongoDb中的Map Reduce。
MongoDb聚合框架不适用于此模式,如果可能,将导致非常冗长的管道。此外,它目前仅限于16MB的结果,并且不会轻易返回超过您汇总的字段。返回select *
需要手动字段投影,可能不止一次,具体取决于所需的输出。
鉴于你想要返回多个字段,结果不是聚合,我建议做一些更简单的事情:
预先计算对greatest
函数的调用结果,并将其作为新字段存储在文档中,以便在各种查询中轻松访问。