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



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

我的意思是MySQL代码中类似这样的东西的mongo替代:

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

…而7应该是调用mongo查询的语言中的一个变量。

尝试 $literal 操作符,如果使用聚合框架 $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
}

MongoDB查询操作中实际"修改"返回的结果而不是原始文档或"字段选择"的唯一事情是.aggregate()方法或mapReduce中的JavaScript操作替代。

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

所以如果你想从服务器返回其他东西,那么你需要使用这些方法之一:

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 }
    }
);

这些基本上是你的选择

相关内容

  • 没有找到相关文章

最新更新