如何在mongodb聚合管道中使用Javascript对象?

如何在mongodb聚合管道中使用Javascript对象?,javascript,mongodb,aggregation-framework,Javascript,Mongodb,Aggregation Framework,我有一个JS对象norm,我想在mongo聚合管道中使用它,如下所示: var norm={ 1: 1, 2: 1.16, 3: 1.413, 4: 1.622, 5: 1.6, 6: 1.753, 7: 3.001, 8: 2.818, 9: 3.291, 10: 2.824, 11: 2.993, 12: 2.699, 13: 1.099, 14: 1.035, 15: 1.172, 16: 1.013, 17: 0.9936, 18: 1.069 }; db.mycoll.aggrega

我有一个JS对象
norm
,我想在mongo聚合管道中使用它,如下所示:

var norm={
1: 1, 
2: 1.16,
3: 1.413,
4: 1.622,
5: 1.6,
6: 1.753,
7: 3.001,
8: 2.818,
9: 3.291,
10: 2.824,
11: 2.993,
12: 2.699,
13: 1.099,
14: 1.035,
15: 1.172,
16: 1.013,
17: 0.9936,
18: 1.069
};
db.mycoll.aggregate([
{$match:
{“_id.day”:ISODate(“2014-06-19T00:00:00.000Z”),
“_id.lt”:“l”,
“_id.rt”:“rltdlsts”,
“_id.m”:false}
},
{$unwind:'$value.rl'},
{$match:{'value.rl.p':{$gte:1,$lte:18}},
{$group:{{U id:'$value.rl.a',
v:{$sum:'$value.rl.v'},
nv:{$sum:{$multiply:[norm['$value.rl.p'],'$value.rl.v']},
c:{$sum:'$value.rl.c'}
}},
{$项目:{
_id:“$\u id”,
‘v’:“$v”,
‘c’:“$c”,
“nv”:“$nv”
}
},
{$sort:{''u id':1}
])
我得到的结果如下,
nv
始终为0:

{
“结果”:[
{
“_id”:1,
“v”:89172,
“nv”:0,
“c”:604
}, 
{
“_id”:4,
“v”:67872,
“nv”:0,
“c”:296
}, 
{
“_id”:5,
“v”:33999,
“nv”:0,
“c”:13
}, 
{
“_id”:6,
“v”:4727,
“nv”:0,
“c”:6
}, 
{
“_id”:8,
“v”:913118,
“nv”:0,
“c”:14055
}, 
{
“_id”:9,
“v”:204099,
“nv”:0,
“c”:3021
}, 
{
“_id”:11,
“v”:151711,
“nv”:0,
“c”:1075
}, 
{
“_id”:12,
“v”:196369,
“nv”:0,
“c”:601
}, 
{
“_id”:13,
“v”:277705,
“nv”:0,
“c”:2302
}, 
{
“_id”:14,
“v”:64005,
“nv”:0,
“c”:970
}, 
{
“_id”:15,
“v”:54558,
“nv”:0,
“c”:326
}, 
{
“_id”:16,
“v”:74576,
“nv”:0,
“c”:305
}, 
{
“_id”:17,
“v”:1144,
“nv”:0,
“c”:1
}, 
{
“_id”:18,
“v”:1023,
“nv”:0,
“c”:0
}, 
{
“_id”:19,
“v”:54511,
“nv”:0,
“c”:98
}, 
{
“_id”:20,
“v”:674,
“nv”:0,
“c”:0
}, 
{
“_id”:21,
“v”:3359,
“nv”:0,
“c”:4
}, 
{
“_id”:22,
“v”:496402,
“nv”:0,
“c”:3786
}, 
{
“_id”:23,
“v”:293212,
“nv”:0,
“c”:1904年
}, 
{
“_id”:24,
“v”:764087,
“nv”:0,
“c”:8847
}, 
{
“_id”:25,
“v”:291358,
“nv”:0,
“c”:7012
}, 
{
“_id”:28,
“v”:2933,
“nv”:0,
“c”:27
}
],
“好”:1
}

如何解决此问题?

在聚合框架下,有几种方法可以解决此问题,而无需借助mapReduce。最近的MongoDB 2.6和更高版本有一些操作符可以帮助您使用和定义变量以及处理数组

出于以下目的,您的外部声明看起来更好:

var范数=[
{“键”:1,“值”:1},
{“键”:2,“值”:1.16},
{“键”:3,“值”:1.413},
{“键”:4,“值”:1.622},
{“键”:5,“值”:1.6},
{“键”:6,“值”:1.753},
{“键”:7,“值”:3.001},
{“键”:8,“值”:2.818},
{“键”:9,“值”:3.291},
{“键”:10,“值”:2.824},
{“键”:11,“值”:2.993},
{“键”:12,“值”:2.699},
{“键”:13,“值”:1.099},
{“键”:14,“值”:1.035},
{“键”:15,“值”:1.172},
{“键”:16,“值”:1.013},
{“键”:17,“值”:0.9936},
{“键”:18,“值”:1.069}
];
然后处理聚合语句:

db.mycoll.aggregate([
{“$match”:{
“_id.day”:ISODate(“2014-06-19T00:00:00.000Z”),
“_id.lt”:“l”,
“_id.rt”:“rltdlsts”,
“_id.m”:错误
}},
{“$unwind”:“$value.rl”},
{“$match”:{“value.rl.p”:{“$gte”:1,“$lte”:18}},
{“$project”:{
“价值”:1,
“规范”:{
“$let”:{
“vars”:{
“规范”:规范
},
“在”:{
“$setDifference”:[
{“$map”:{
“输入”:“$$norm”,
“as”:“norm”,
“在”:{
“$cond”:[
{“$eq”:[“$$norm.key”,“$value.rl.p”]},
“$$norm.value”,
假的
]
}
}},
[错误]
]
}
}               
}
}},
{“$unwind”:“$norm”}
{“$组”:{
“_id”:“$value.rl.a”,
“v”:{“$sum”:“$value.rl.v”},
“c”:{“$sum”:“$value.rl.c