mongodb查找带有计算字段的

时间:2018-07-26 07:25:43

标签: node.js mongodb

我正在尝试使用过滤器中的过滤后的值创建mongodb查询。例如:

   var myIdVariable = '1jig23h34r34r30h';
   var myVisibleVariable = false;
   var myDistanceVariable = 100;

   db.getCollection.find({
        '_id': myIdVariable,
        'isVisible': myVisibleVariable,
        'distanceRange': {$lte: {myDistanceVariable - distanceRange}}
    })

因此,我想基于(myDistanceVariable-distanceRange)的计算从数据库中过滤distanceRange,并在同一查询中给出distanceRange。 我不知道我是否能给您清楚说明我的问题。有可能吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

使用 $expr 运算符来构建查询表达式,该表达式可用于比较同一文档中的字段以及将distanceRange字段与字段的计算结果进行比较本身和您的变量。

您将需要使用逻辑 $and 查询运算符来包含其他查询表达式,因此您的最终查询将如下所示:

db.getCollection('collectionName').find({
    '$expr': {
        '$and': [
            { 'isVisible': myVisibleVariable },
            { '$lte': [
                '$distanceRange', {
                    '$subtract': [
                        myDistanceVariable, '$distanceRange'
                    ]
                }
            ] }
        ]
    }
})

如果您的MongoDB服务器不支持 $expr 运算符,请使用 $redact

进行聚合框架路由
db.getCollection('collectionName').aggregate([
    { "$redact": {
        "$cond": [
            {   
                '$and': [
                    { 'isVisible': myVisibleVariable },
                    { '$lte': [
                        '$distanceRange', {
                            '$subtract': [
                                x, '$distanceRange'
                            ]
                        }
                    ] }
                ]
            },
            "$$KEEP",
            "$$PRUNE"
        ]
    } }
])

注意

在查询表达式中包含_id意味着您将选择范围缩小到单个文档,并且查询可能不返回任何结果,因为它正在寻找具有该_id的特定文档,并且同一文档应满足其他查询表达式。