如何查询MongoDB for column1> column2 * 5?

时间:2016-05-31 13:42:49

标签: mongodb mongodb-query

是否可以获取包含column1>的记录? (第2栏* 5)? 我试过了,但没有回复:

db.getCollection('rss').find({'duplicates': {$gt: 'total_count' * 5}})

1 个答案:

答案 0 :(得分:2)

您可以使用 $where 运算符来传入JavaScript表达式:

db.getCollection('rss').find({ "$where": "this.duplicates > (this.total_count * 5)" }) 
// sama as db.getCollection('rss').find("this.duplicates > (this.total_count * 5)")

或将聚合框架与 $cmp 运算符一起使用,这比上面的效果更有效,因为单独使用 $where 将需要Mongo进行集合扫描,其中每个文档必须从BSON转换为JavaScript对象,然后运行 $where 表达式。索引也不能用于满足 $where 表达式,因此性能大大降低,查询速度也慢得多。

使用 $cmp 运算符可以提供更好的性能,因为它会比较两个值并返回

    如果第一个值小于第二个值,则
  • -1。
  • 如果第一个值大于第二个值,则
  • 1。
  • 如果两个值相等,则
  • 0。

所以你的最终查询看起来像是:

db.getCollection('rss').aggregate([
    {
        "$project": {
            // Project other fields as required
            "duplicates": 1,
            "total_count": 1,
            "isGreater": {
                "$cmp": [
                    "$duplicates", 
                    { "$multiply": [ "$total_count", 5 ] }
                ]
            }
        }
    },
    { "$match": { "isGreater": 1 } } 
])