MongoDB聚合查询

丹尼·布诺科

我正在尝试在数据库中查询一组值,但我不想获取值本身,而是希望该值与另一个日期最近的文档(具有不同要求)的值相乘。这是我目前通过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联接来自每个用户的相应文档中的值,但没有完全匹配的字段,我看不到我该怎么做。

我在正确的轨道上吗?必须有一种更好的方法来完成此任务。

s7vr

您可以在3.6中尝试以下汇总查询

使用$lookuplet语法。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章