有没有办法在mongo查询响应中包含自定义数据?
我的意思是在MySQL代码中使用mongo代替这样的东西:
SELECT
value,
'7' AS min_value
FORM
my_table
WHERE
value >= 7
...虽然7
应该是调用mongo查询的语言中的变量。
答案 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 }
}
);
这些基本上是你的选择。