如何在mongo中选择自定义数据

时间:2015-10-14 10:12:06

标签: mongodb mapreduce mongodb-query aggregation-framework

有没有办法在mongo查询响应中包含自定义数据?

我的意思是在MySQL代码中使用mongo代替这样的东西:

SELECT
    value,
    '7' AS min_value
FORM
    my_table
WHERE
    value >= 7

...虽然7应该是调用mongo查询的语言中的变量。

2 个答案:

答案 0 :(得分:2)

如果使用带有$literal管道步骤的aggregation framework作为查询过滤器,请尝试使用$match运算符。例如,在mongo shell中创建一个样本集合,其中包含10个测试文档,其中value字段为增量整数(0到9):

 for(x=0;x<10;x++){ db.my_table.insert({value: x }) }

运行以下聚合管道:

var base = 7;
db.my_table.aggregate([
    {
        "$match": { 
            "value": { "$gte": base }
        }
    },
    {
        "$project": {
            "value": 1,
            "min_value": { "$literal": base }
        }
    }
])

会产生结果:

/* 0 */
{
    "result" : [ 
        {
            "_id" : ObjectId("561e2bcc3d8f561c1548d39b"),
            "value" : 7,
            "min_value" : 7
        }, 
        {
            "_id" : ObjectId("561e2bcc3d8f561c1548d39c"),
            "value" : 8,
            "min_value" : 7
        }, 
        {
            "_id" : ObjectId("561e2bcc3d8f561c1548d39d"),
            "value" : 9,
            "min_value" : 7
        }
    ],
    "ok" : 1
}

答案 1 :(得分:2)

MongoDB查询操作中唯一能够实际“修改”原始文档或"field selection"之外返回的结果的操作是.aggregate()方法或mapReduce中的JavaScript操作替代。< / p>

否则文档将“按原样”返回,或者至少只返回指定的选定字段或数组条目。

因此,如果您想从服务器返回其他内容,则需要使用以下方法之一:

var seven = 7;

db.collection.aggregate([
    { "$match": {
        "value": { "$gt": seven }
    }},
    { "$project": {
        "value": 1,
        "min_value": { "$literal": seven }
    }}
])

$literal运算符发挥作用,或2.6之前的版本或更高或等于2.2(引入聚合框架)的地方可以使用$const代替:

var seven = 7;

db.collection.aggregate([
    { "$match": {
        "value": { "$gt": seven }
    }},
    { "$project": {
        "value": 1,
        "min_value": { "$const": seven }
    }}
])

或者只使用mapReduce及其JavaScript翻译:

var seven = 7;

db.mapReduce(
    function() {
        emit(this._id,{ "value": this.value, "min_value": seven });
    },
    function() {},  // no reduce at all since all _id unique
    { 
        "out": { "inline": 1 },
        "query": { "value": { "$gt": seven } },
        "scope": { "seven": seven }
    }
);

这些基本上是你的选择。