我正在尝试在数据库中查询一组值,但我不想获取值本身,而是希望该值与另一个日期最近的文档(具有不同要求)的值相乘。这是我目前通过n + 1
查询执行的操作:
Model.find({
user: user1,
date: { $gte: start, $lte: end }
}, 'date value', (err, results) => {
results.forEach(e => {
Model.find({
user: user2,
date: { $gte: e.date }
}, 'value').sort({ date: 1 }).limit(1).exec((err, matched) => {
e.value *= matched[0].value;
});
});
});
因此,我想要与相关联的日期范围内的值user1
,每个值都乘以与相关联的最近文档(日期中)的值user2
。无法保证的日期user1
和日期user2
将完全相同,因此我使用$gte
,排序和限制的组合来获取最接近的日期(我知道这是不准确的,因为可能比该日期更早一些,但这已经足够了)。
我在想一定有办法做到这一点aggregate
。我一直在寻找使用$lookup
联接来自每个用户的相应文档中的值,但没有完全匹配的字段,我看不到我该怎么做。
我在正确的轨道上吗?必须有一种更好的方法来完成此任务。
您可以在3.6中尝试以下汇总查询
使用$lookup
let语法。
Model.aggregate([
{"$match":{
"user": user1,
"date": {"$gte":start, "$lte":end}
}},
{"$lookup":{
"from": collectionname, use collection name here
"let": {"date":"$date"},
"pipeline":[
{"$match":{
"user": user2,
"$expr":{"$gte":["$date","$$date"]}
}},
{"$sort":{"date": 1}},
{"$limit":1},
{"$project":{"value":1}}
],
"as": "lookup-data"
}},
{"$project":{
"date":1,
"value":{
"$multiply":[
"$value", {
"$let":{
"vars":{"lookupdata":{"$arrayElemAt":["$lookup-data",0]}},
"in":"$$lookupdata.value"
}
}
]
}
}}
])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句