聚合框架中的项目布尔值

时间:2014-02-11 19:55:21

标签: mongodb aggregation-framework nosql

使用MongoDB的聚合框架可以project操作的布尔值吗?

例如,给定一个像这样的输入文档:

{
  "id": 123,
  "data": [
    {
      "val": 1
    },
    {
      "val": 2
    },
    {
      "val": 3
    },
    {
      "val": 4
    },
    {
      "val": 5
    }
  ]
}

操作为$data.val > 3我想回复:

{
  "result": [
    {
      "bool_val": 0
    },
    {
      "bool_val": 0
    },
    {
      "bool_val": 0
    },
    {
      "bool_val": 1
    },
    {
      "bool_val": 1
    }
  ],
  "ok": 1
}

这就是我提出的:

db.test.aggregate([{$match: {id: 123}}, 
                   {$unwind: "$data"}, 
                   {$project: {"bool_val": {"$data.val": {$gt: 3}}, _id: 0}} 
                  ]) 

产生以下错误:

aggregate failed: {
  "errmsg": "exception: invalid operator '$data.val'", 
  "code": 15999,
  "ok": 0
} 

2 个答案:

答案 0 :(得分:3)

您必须使用$cond

db.test.aggregate([
    {
        $match: {id: 123}
    }, 
    {
        $unwind: "$data"
    }, 
    {
        $project: {
            "bool_val": { 
                $cond: [ {$gt: [ "$data.val", 3] }, 1, 0 ]
            }, 
            _id: 0
        }
    } 
]) 

答案 1 :(得分:0)

作为参考,多个条件的语法是:

db.test.aggregate([
    {
        $match: {id: 123}
    }, 
    {
        $unwind: "$data"
    }, 
    {
        $project: {
            "bool_val": { $cond: [ {$and: [{$gt: ["$data.val", 3]}, 
                                            {$lte: ["$data.val", 5]} ]  
                        }, 1, 0]},
            _id: 0
        }
    } 
])