是否有办法在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 }
}
);
这些基本上是你的选择