通过比较字段值查找MongoDB

11

以下SQL查询在mongodb中是否可行:

SELECT * FROM table AS t WHERE t.field1 > t.filed2;

编辑: 总结如下:

  1. 使用存储“field1-field2”的第三个字段几乎是完美的,但需要一些额外的维护。
  2. $where将在JavaScript中加载和评估,并且不会使用任何索引。对于大数据不好。
  3. map/reduce有相同的问题,即使我们只需要一个记录,也会遍历所有记录。

我不想引发争端,但是天哪,我非常讨厌NoSQL。 - Blago
1
如果你不知道在哪里以及如何正确使用它,那么请不要使用它。NoSQL并不能替代关系型数据库! - user2665694
这是我沮丧的根源。大多数人将其称为替代品。我看到越来越多的比较是关于旧(关系型)与现代(NoSQL)数据存储的区别。 - Blago
3个回答

20

你可以使用 $where 来实现:

db.coll.find( { $where: "this.field1 > this.field2" } );

但是:

JavaScript的执行速度比本地运算符要慢,但它非常灵活。

如果性能是一个问题,最好按照@yi_H建议的方式进行。


1
使用 $where 是不推荐的。yi_H 的答案是正确的! - user2665694
3
@Sentinel:您在投票之前是否已经完整阅读了我的回答?我说JavaScript运行速度较慢,最好像@yi_H建议的那样创建额外字段。但是,无论如何,$where操作符存在,我绝对确定它可以在某些情况下使用,当性能不是问题时。 - Andrew Orsich
2
只有在你有一个小的集合或者使用其他条件(这些条件使用索引并返回集合的一个小子集)进行了预过滤时,才使用此方法。MongoDB不知道如何加速此查询,并将执行完整的表扫描。 - Karoly Horvath
@yi_H:是的,我知道全表扫描。无论如何,感谢您的澄清。 - Andrew Orsich
4
不是这样的。这就是为什么我们不再使用汇编语言进行编程的原因。 - David Raab

15
你可以将文档中的field1 - field2存储为field3,然后搜索{ field3: { $gt: 0 } }。同时也可以使用mapreduce来获取匹配的文档。

7
我应该提到,你可以存储布尔值,这在性能方面更好。 - Karoly Horvath

3
您可以使用 $where。但请注意,它会相当慢(必须在每个记录上执行Javascript代码),因此如果可能的话,请与索引查询结合使用。
db.T.find( { $where: function() { return this.Grade1 > this.Grade2 } } );

更加紧凑的写法如下:

db.T.find( { $where : "this.Grade1 > this.Grade2" } );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接